namespace GestionIntegral.Api.Dtos.Reportes.ViewModels
{
    /// 
    /// Representa una agrupación de suscripciones por publicación para el reporte.
    /// 
    public class GrupoPublicacion
    {
        public string NombrePublicacion { get; set; } = string.Empty;
        public IEnumerable Suscripciones { get; set; } = Enumerable.Empty();
    }
    /// 
    /// Representa una agrupación de publicaciones por empresa para el reporte.
    /// 
    public class GrupoEmpresa
    {
        public string NombreEmpresa { get; set; } = string.Empty;
        public IEnumerable Publicaciones { get; set; } = Enumerable.Empty();
    }
    public class DistribucionSuscripcionesViewModel
    {
        public IEnumerable DatosAgrupadosAltas { get; }
        public IEnumerable DatosAgrupadosBajas { get; }
        public string FechaDesde { get; set; } = string.Empty;
        public string FechaHasta { get; set; } = string.Empty;
        public string FechaGeneracion { get; set; } = string.Empty;
        public DistribucionSuscripcionesViewModel(IEnumerable altas, IEnumerable bajas)
        {
            // Función local para evitar repetir el código de agrupación
            Func, IEnumerable> agruparDatos = (suscripciones) =>
            {
                return suscripciones
                    .GroupBy(s => s.NombreEmpresa)
                    .Select(gEmpresa => new GrupoEmpresa
                    {
                        NombreEmpresa = gEmpresa.Key,
                        Publicaciones = gEmpresa
                            .GroupBy(s => s.NombrePublicacion)
                            .Select(gPub => new GrupoPublicacion
                            {
                                NombrePublicacion = gPub.Key,
                                Suscripciones = gPub.OrderBy(s => s.NombreSuscriptor).ToList()
                            })
                            .OrderBy(p => p.NombrePublicacion)
                    })
                    .OrderBy(e => e.NombreEmpresa);
            };
            DatosAgrupadosAltas = agruparDatos(altas);
            DatosAgrupadosBajas = agruparDatos(bajas);
        }
    }
}