namespace GestionIntegral.Api.Dtos.Reportes.ViewModels
{
    /// <summary>
    /// Representa una agrupación de suscripciones por publicación para el reporte.
    /// </summary>
    public class GrupoPublicacion
    {
        public string NombrePublicacion { get; set; } = string.Empty;
        public IEnumerable<DistribucionSuscripcionDto> Suscripciones { get; set; } = Enumerable.Empty<DistribucionSuscripcionDto>();
    }

    /// <summary>
    /// Representa una agrupación de publicaciones por empresa para el reporte.
    /// </summary>
    public class GrupoEmpresa
    {
        public string NombreEmpresa { get; set; } = string.Empty;
        public IEnumerable<GrupoPublicacion> Publicaciones { get; set; } = Enumerable.Empty<GrupoPublicacion>();
    }

    public class DistribucionSuscripcionesViewModel
    {
        public IEnumerable<GrupoEmpresa> DatosAgrupadosAltas { get; }
        public IEnumerable<GrupoEmpresa> 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<DistribucionSuscripcionDto> altas, IEnumerable<DistribucionSuscripcionDto> bajas)
        {
            // Función local para evitar repetir el código de agrupación
            Func<IEnumerable<DistribucionSuscripcionDto>, IEnumerable<GrupoEmpresa>> 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);
        }
    }
}