using adas_core.Domain.Models.MongoModels;

namespace adas_core.Domain.Utils;

/// <summary>
/// Provides static extension methods for <see cref="CardConfig"/> to augment its functionality.
/// </summary>
/// <remarks>
/// This class is a static container for extension methods that extend the capabilities of the <see cref="CardConfig"/> type.
/// </remarks>
public static class CardConfigExtensions
{
    // Método principal para extraer todos los nombres
    public static List<string> GetAllObservationNames(this CardConfig config)
    {
        if (config.Rows == null) return [];

        // 1. Usar SelectMany para aplanar la lista de Rows a una lista de Cells.
        var allCells = config.Rows.Where(r => r.Cells != null)
            .SelectMany(r => r.Cells!);

        // 2. Usar SelectMany y el método recursivo para obtener todos los nombres de todas las Cells.
        var observationNames = allCells.SelectMany(ExtractObservationNames)
            .Distinct() // Opcional: para asegurar que los nombres sean únicos
            .ToList();

        return observationNames;
    }

    // Método auxiliar RECURSIVO para extraer nombres de una Cell y sus SubObs
    private static IEnumerable<string> ExtractObservationNames(Cell cell)
    {
        // 1. Si la Cell tiene ObservationName, devolver esos nombres.
        if (cell.ObservationName != null)
            // Retornar los elementos de la lista ObservationName
            foreach (var name in cell.ObservationName)
                yield return name;

        // 2. Si la Cell tiene SubObs, llamar recursivamente al método para cada SubObs.
        if (cell.SubObs == null) yield break;
        {
            foreach (var name in cell.SubObs.SelectMany(ExtractObservationNames))
                yield return name;
        }
    }
}