using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq; // Necesario para .Any() y .Sum()

namespace GestionIntegral.Api.Dtos.Reportes.ViewModels
{
    public class ListadoDistribucionGeneralViewModel
    {
        public IEnumerable<ListadoDistribucionGeneralResumenDto> ResumenMensual { get; set; } = new List<ListadoDistribucionGeneralResumenDto>();
        public IEnumerable<ListadoDistribucionGeneralPromedioDiaDto> PromediosPorDia { get; set; } = new List<ListadoDistribucionGeneralPromedioDiaDto>();

        public string NombrePublicacion { get; set; } = string.Empty;
        public string MesConsultado { get; set; } = string.Empty;
        public string FechaReporte { get; set; } = DateTime.Now.ToString("dd/MM/yyyy");

        public ListadoDistribucionGeneralPromedioDiaDto? PromedioGeneral
        {
            get
            {
                if (ResumenMensual == null || !ResumenMensual.Any())
                {
                    return null;
                }
                
                // 1. Filtrar solo los días con actividad para no diluir el promedio.
                var diasActivos = ResumenMensual.Where(r => r.CantidadTirada > 0).ToList();

                if (!diasActivos.Any())
                {
                    return null; // No hay días con actividad, no se puede calcular el promedio.
                }
                
                // 2. Usar el conteo de días activos como divisor.
                var totalDiasActivos = diasActivos.Count;

                return new ListadoDistribucionGeneralPromedioDiaDto
                {
                    Dia = "General",
                    CantidadDias = totalDiasActivos,
                    // 3. Calcular el promedio real: Suma de valores / Cantidad de días activos.
                    // Se usa división entera para que coincida con el formato sin decimales.
                    PromedioTirada = diasActivos.Sum(r => r.CantidadTirada) / totalDiasActivos,
                    PromedioSinCargo = diasActivos.Sum(r => r.SinCargo) / totalDiasActivos,
                    PromedioPerdidos = diasActivos.Sum(r => r.Perdidos) / totalDiasActivos,
                    PromedioLlevados = diasActivos.Sum(r => r.Llevados) / totalDiasActivos,
                    PromedioDevueltos = diasActivos.Sum(r => r.Devueltos) / totalDiasActivos,
                    PromedioVendidos = diasActivos.Sum(r => r.Vendidos) / totalDiasActivos
                };
            }
        }
    }
}