using System;
using System.Collections.Generic;
using System.Linq;

namespace GestionIntegral.Api.Dtos.Reportes.ViewModels
{
    public class ListadoDistribucionDistribuidoresViewModel
    {
        public IEnumerable<ListadoDistribucionDistSimpleDto> DetalleDiario { get; set; } = new List<ListadoDistribucionDistSimpleDto>();
        public IEnumerable<ListadoDistribucionDistPromedioDiaDto> PromediosPorDia { get; set; } = new List<ListadoDistribucionDistPromedioDiaDto>();

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

        // --- PROPIEDAD CALCULADA PARA LA FILA "GENERAL" ---
        public ListadoDistribucionDistPromedioDiaDto? PromedioGeneral
        {
            get
            {
                if (PromediosPorDia == null || !PromediosPorDia.Any())
                {
                    return null;
                }
                var promediosValidos = PromediosPorDia.Where(p => p.Dia != "General").ToList();
                if (!promediosValidos.Any()) return null;
                var countPromedios = promediosValidos.Count;
                var sumPromLlevados = promediosValidos.Sum(p => p.Promedio_Llevados ?? 0);
                var sumPromDevueltos = promediosValidos.Sum(p => p.Promedio_Devueltos ?? 0);
                var sumPromVentas = promediosValidos.Sum(p => p.Promedio_Ventas ?? 0);

                return new ListadoDistribucionDistPromedioDiaDto
                {
                    Dia = "General",
                    Cant = promediosValidos.Sum(p => p.Cant ?? 0),
                    Promedio_Llevados = (int)Math.Round((decimal)sumPromLlevados / countPromedios, MidpointRounding.AwayFromZero),
                    Promedio_Devueltos = (int)Math.Round((decimal)sumPromDevueltos / countPromedios, MidpointRounding.AwayFromZero),
                    Promedio_Ventas = (int)Math.Round((decimal)sumPromVentas / countPromedios, MidpointRounding.AwayFromZero),
                    Llevados = (int)Math.Round((decimal)sumPromLlevados / countPromedios, MidpointRounding.AwayFromZero),
                    Devueltos = (int)Math.Round((decimal)sumPromDevueltos / countPromedios, MidpointRounding.AwayFromZero)
                };
            }
        }
    }
}