using adas_core.Domain.Models.MongoModels;

namespace adas_core.Domain.Utils;

/// <summary>
/// Provides extension methods for the <see cref="DetailConfigExtension"/> type.
/// </summary>
/// <remarks>
/// This is a static utility class that cannot be instantiated and is intended to extend the functionality of <see cref="DetailConfigExtension"/> through extension method definitions.
/// </remarks>
public static class DetailConfigExtension
{
    // Método principal para iniciar la extracción
    public static List<string> GetAllObservationNames(this CardDetailsConfig config)
    {
        if (config.NurseRows == null) return [];

        // Se usa el método auxiliar para recorrer todas las RowDetailsConfig
        var observationNames = ExtractNamesFromRows(config.NurseRows)
            .Distinct() // Opcional: para nombres únicos
            .ToList();

        return observationNames;
    }

    // --- Auxiliar 1: Recorre la anidación de Filas (RowDetailsConfig) ---
    private static IEnumerable<string> ExtractNamesFromRows(List<RowDetailsConfig> rows)
    {
        foreach (var row in rows)
        {
            // 1. EXTRAER de las CELDAS (Cells)
            if (row.Cells != null)
                // Usar SelectMany para aplanar los resultados del método recursivo de Celdas
                foreach (var name in row.Cells.SelectMany(ExtractNamesFromCells))
                    yield return name;

            // 2. EXTRAER de las FILAS ANIDADAS (Rows)
            if (row.Rows != null)
                // Llamada recursiva: Volver a este mismo método para procesar las filas anidadas
                foreach (var name in ExtractNamesFromRows(row.Rows))
                    yield return name;
        }
    }

    // --- Auxiliar 2: Recorre la anidación de Celdas (CellDetails) ---
    private static IEnumerable<string> ExtractNamesFromCells(CellDetails cell)
    {
        // 1. EXTRAER nombres del nivel actual
        if (cell.ObservationName != null)
            foreach (var name in cell.ObservationName)
                yield return name;

        // 2. EXTRAER de las CELDAS ANIDADAS (Cells)
        if (cell.Cells != null)
            // Llamada recursiva: Volver a este mismo método para procesar las celdas anidadas
            foreach (var name in cell.Cells.SelectMany(ExtractNamesFromCells))
                yield return name;
    }
}