using GestionIntegral.Api.Dtos.Reportes.ViewModels;
using QuestPDF.Fluent;
using QuestPDF.Helpers;
using QuestPDF.Infrastructure;
using System.Linq;

namespace GestionIntegral.Api.Controllers.Reportes.PdfTemplates
{
    public class ControlDevolucionesDocument : IDocument
    {
        public ControlDevolucionesViewModel Model { get; }

        public ControlDevolucionesDocument(ControlDevolucionesViewModel model)
        {
            Model = model;
        }

        public DocumentMetadata GetMetadata() => DocumentMetadata.Default;
        public DocumentSettings GetSettings() => DocumentSettings.Default;

        public void Compose(IDocumentContainer container)
        {
            container.Page(page =>
            {
                page.Margin(1, Unit.Centimetre);
                page.DefaultTextStyle(x => x.FontFamily("Roboto").FontSize(11));

                page.Header().Element(ComposeHeader);
                page.Content().Element(ComposeContent);
            });
        }

        void ComposeHeader(IContainer container)
        {
            container.Column(column =>
            {
                column.Item().AlignCenter().Text("Control de Devoluciones").SemiBold().FontSize(16);
                column.Item().AlignCenter().Text("Canillas / Accionistas").FontSize(13);
            });
        }

        void ComposeContent(IContainer container)
        {
            // << CAMBIO: Reducido el padding superior de 1cm a 5mm >>
            container.PaddingTop(5, Unit.Millimetre).Column(column =>
            {
                // << CAMBIO: Reducido el espaciado principal entre elementos de 15 a 10 puntos >>
                column.Spacing(10);

                column.Item().Row(row =>
                {
                    row.RelativeItem().Text(text =>
                    {
                        text.Span("Fecha Consultada: ").SemiBold();
                        text.Span(Model.FechaConsultada);
                    });
                    row.RelativeItem().AlignRight().Text(text =>
                    {
                        text.Span("Cantidad Canillas: ").SemiBold();
                        text.Span(Model.CantidadCanillas.ToString());
                    });
                });
                
                column.Item().PaddingTop(3).Border(1).Background(Colors.Grey.Lighten3).AlignCenter().Padding(2).Text(Model.NombreEmpresa).SemiBold();

                column.Item().Border(1).Padding(8).Column(innerCol => // << CAMBIO: Padding reducido de 10 a 8 >>
                {
                    // << CAMBIO: Reducido el espaciado interno de 5 a 4 >>
                    innerCol.Spacing(4);
                    
                    innerCol.Item().BorderBottom(1, Unit.Point).BorderColor(Colors.Grey.Medium).Row(row =>
                    {
                        row.RelativeItem().Text("Ingresados por Remito:").SemiBold();
                        row.RelativeItem().AlignRight().Text(Model.TotalIngresadosPorRemito.ToString("N0"));
                    });
                    
                    foreach (var item in Model.Detalles)
                    {
                        var totalSeccion = item.Devueltos - item.Llevados;
                        // << CAMBIO: Reducido el padding superior de 5 a 3 >>
                        innerCol.Item().PaddingTop(3).Row(row =>
                        {
                            row.ConstantItem(100).Text(item.Tipo).SemiBold();
                            
                            row.RelativeItem().Column(sub =>
                            {
                                sub.Spacing(2);
                                sub.Item().Row(r => {
                                    r.RelativeItem().Text("Llevados");
                                    r.RelativeItem().AlignRight().Text($"-{item.Llevados:N0}");
                                });
                                sub.Item().Row(r => {
                                    r.RelativeItem().Text("Devueltos");
                                    r.RelativeItem().AlignRight().Text($"{item.Devueltos:N0}");
                                });
                                // << CAMBIO: Reducido el padding superior de 2 a 1 >>
                                sub.Item().BorderTop(1.5f).BorderColor(Colors.Black).PaddingTop(1).Row(r => {
                                    r.RelativeItem().Text(t => t.Span("Total").SemiBold());
                                    r.RelativeItem().AlignRight().Text(t => t.Span(totalSeccion.ToString("N0")).SemiBold());
                                });
                            });
                        });
                    }
                });
                
                // << CAMBIO: Reducido el padding superior de 10 a 8 >>
                column.Item().PaddingTop(8).Column(finalCol =>
                {
                    finalCol.Spacing(2);
                    
                    Action<RowDescriptor, string, string, bool> AddTotalRow = (row, label, value, isBold) =>
                    {
                        var text = row.RelativeItem().Text(label);
                        if (isBold) text.SemiBold();
                        
                        var valueText = row.ConstantItem(80).AlignRight().Text(value);
                        if (isBold) valueText.SemiBold();
                    };
                    
                    // << CAMBIO: Reducido el padding superior de 2 a 1 en las siguientes líneas >>
                    finalCol.Item().BorderTop(2f).BorderColor(Colors.Black).PaddingTop(1).Row(row => AddTotalRow(row, "Total Devolución a la Fecha", Model.TotalDevolucionALaFecha.ToString("N0"), false));
                    finalCol.Item().BorderTop(1).BorderColor(Colors.Grey.Lighten2).PaddingTop(1).Row(row => AddTotalRow(row, "Total Devolución Días Anteriores", Model.TotalDevolucionDiasAnteriores.ToString("N0"), false));
                    finalCol.Item().BorderTop(1).BorderColor(Colors.Grey.Lighten2).PaddingTop(1).Row(row => AddTotalRow(row, "Total Devolución", Model.TotalDevolucionGeneral.ToString("N0"), false));
                    // << CAMBIO: Reducido el padding superior de 5 a 3 >>
                    finalCol.Item().BorderTop(2f).BorderColor(Colors.Black).PaddingTop(3).Row(row => AddTotalRow(row, "Sin Cargo", Model.TotalSinCargo.ToString("N0"), false));
                    finalCol.Item().BorderTop(1).BorderColor(Colors.Grey.Lighten2).PaddingTop(1).Row(row => AddTotalRow(row, "Sobrantes", $"-{Model.TotalSobrantes.ToString("N0")}", false));
                    // << CAMBIO: Reducido el padding superior de 5 a 3 >>
                    finalCol.Item().BorderTop(1).BorderColor(Colors.Grey.Lighten2).BorderBottom(1).BorderColor(Colors.Grey.Lighten2).PaddingTop(3).Row(row => AddTotalRow(row, "Diferencia", Model.DiferenciaFinal.ToString("N0"), true));
                });
            });
        }
    }
}