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

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

        public string NombrePublicacion { 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");

        public ListadoDistribucionCanillasSimpleDto TotalesDetalleDiario
        {
            get
            {
                if (DetalleDiario == null || !DetalleDiario.Any())
                {
                    return new ListadoDistribucionCanillasSimpleDto();
                }
                return new ListadoDistribucionCanillasSimpleDto
                {
                    Llevados = DetalleDiario.Sum(d => d.Llevados),
                    Devueltos = DetalleDiario.Sum(d => d.Devueltos)
                };
            }
        }

        public decimal PorcentajeDevolucionGeneral
        {
            get
            {
                if (PromediosPorDia == null || !PromediosPorDia.Any()) return 0;

                var totalPonderadoLlevados = PromediosPorDia.Sum(p => p.Promedio_Llevados * p.Cant);
                var totalPonderadoDevueltos = PromediosPorDia.Sum(p => p.Promedio_Devueltos * p.Cant);

                if (totalPonderadoLlevados == 0) return 0;

                // Calculamos el porcentaje usando los totales ponderados para máxima precisión como lo hace el frontend.
                return (decimal)totalPonderadoDevueltos * 100 / totalPonderadoLlevados;
            }
        }

        // --- PROPIEDAD PARA LA FILA "GENERAL" ---
        public ListadoDistribucionCanillasPromedioDiaDto? PromedioGeneral
        {
            get
            {
                if (PromediosPorDia == null || !PromediosPorDia.Any()) return null;

                // Sumamos los totales ponderados para cada columna
                var totalPonderadoLlevados = PromediosPorDia.Sum(p => p.Promedio_Llevados * p.Cant);
                var totalPonderadoDevueltos = PromediosPorDia.Sum(p => p.Promedio_Devueltos * p.Cant);
                var totalPonderadoVentas = PromediosPorDia.Sum(p => p.Promedio_Ventas * p.Cant);
                var totalDias = PromediosPorDia.Sum(p => p.Cant);

                if (totalDias == 0) return null;

                // Usamos Math.Round para un redondeo matemático estándar antes de la conversión.
                // MidpointRounding.AwayFromZero asegura que .5 se redondee hacia arriba, igual que en JavaScript.
                var promGeneralLlevados = (int)Math.Round((decimal)totalPonderadoLlevados / totalDias, MidpointRounding.AwayFromZero);
                var promGeneralDevueltos = (int)Math.Round((decimal)totalPonderadoDevueltos / totalDias, MidpointRounding.AwayFromZero);
                var promGeneralVentas = (int)Math.Round((decimal)totalPonderadoVentas / totalDias, MidpointRounding.AwayFromZero);

                return new ListadoDistribucionCanillasPromedioDiaDto
                {
                    Dia = "General",
                    Cant = totalDias,
                    Promedio_Llevados = promGeneralLlevados,
                    Promedio_Devueltos = promGeneralDevueltos,
                    Promedio_Ventas = promGeneralVentas
                };
            }
        }
    }
}