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

namespace GestionIntegral.Api.Controllers.Reportes.PdfTemplates
{
    public class ListadoDistCanillasImporteDocument : IDocument
    {
        public ListadoDistCanillasImporteViewModel Model { get; }
        private static readonly CultureInfo CultureAr = new CultureInfo("es-AR");

        public ListadoDistCanillasImporteDocument(ListadoDistCanillasImporteViewModel model)
        {
            Model = model;
        }

        public DocumentMetadata GetMetadata() => DocumentMetadata.Default;

        public void Compose(IDocumentContainer container)
        {
            container.Page(page =>
            {
                page.Margin(1.5f, Unit.Centimetre);
                page.DefaultTextStyle(x => x.FontFamily("Arial").FontSize(10));
                
                page.Header().Element(ComposeHeader);
                page.Content().Element(ComposeContent);
                page.Footer().AlignCenter().Text(x => { x.Span("Página "); x.CurrentPageNumber(); });
            });
        }

        void ComposeHeader(IContainer container)
        {
            container.Column(column =>
            {
                column.Item().AlignCenter().Text("Listado de Distribución con Importes").SemiBold().FontSize(14);
                column.Item().AlignCenter().Text(Model.TipoDestinatario).FontSize(12);
                column.Item().AlignCenter().Text(Model.NombrePublicacion).FontSize(12);

                column.Item().PaddingTop(5, Unit.Millimetre).Row(row =>
                {
                    row.RelativeItem().Text(text => { text.Span("Fecha de Reporte: ").SemiBold(); text.Span(Model.FechaReporte); });
                    row.RelativeItem().AlignRight().Text(text => { text.Span("Periodo: ").SemiBold(); text.Span($"{Model.FechaDesde} - {Model.FechaHasta}"); });
                });
            });
        }
        
        void ComposeContent(IContainer container)
        {
            container.PaddingTop(1, Unit.Centimetre).Table(table =>
            {
                table.ColumnsDefinition(columns =>
                {
                    columns.RelativeColumn(); // Fecha
                    columns.RelativeColumn(); // Llevados
                    columns.RelativeColumn(); // Devueltos
                    columns.RelativeColumn(); // Vendidos
                    columns.RelativeColumn(1.5f); // Importe Publicación
                    columns.RelativeColumn(1.5f); // A Rendir
                });

                table.Header(header =>
                {
                    header.Cell().Border(1).Background(Colors.Grey.Lighten3).Padding(4).Text("Fecha");
                    header.Cell().Border(1).Background(Colors.Grey.Lighten3).Padding(4).AlignRight().Text("Llevados");
                    header.Cell().Border(1).Background(Colors.Grey.Lighten3).Padding(4).AlignRight().Text("Devueltos");
                    header.Cell().Border(1).Background(Colors.Grey.Lighten3).Padding(4).AlignRight().Text("Vendidos");
                    header.Cell().Border(1).Background(Colors.Grey.Lighten3).Padding(4).AlignRight().Text("Imp. Publicación");
                    header.Cell().Border(1).Background(Colors.Grey.Lighten3).Padding(4).AlignRight().Text("A Rendir");
                });

                foreach (var item in Model.Detalles)
                {
                    table.Cell().Border(1).Padding(3).Text(item.Fecha);
                    table.Cell().Border(1).Padding(3).AlignRight().Text(item.Llevados.ToString("N0"));
                    table.Cell().Border(1).Padding(3).AlignRight().Text(item.Devueltos.ToString("N0"));
                    table.Cell().Border(1).Padding(3).AlignRight().Text(item.Vendidos.ToString("N0"));
                    table.Cell().Border(1).Padding(3).AlignRight().Text(item.TotalRendirPublicacion.ToString("C", CultureAr));
                    table.Cell().Border(1).Padding(3).AlignRight().Text(item.TotalRendirGeneral.ToString("C", CultureAr));
                }

                // Fila de Totales
                var totalLlevados = Model.Detalles.Sum(x => x.Llevados);
                var totalDevueltos = Model.Detalles.Sum(x => x.Devueltos);
                var totalVendidos = Model.Detalles.Sum(x => x.Vendidos);
                var totalRendirPub = Model.Detalles.Sum(x => x.TotalRendirPublicacion);
                var totalRendirGral = Model.Detalles.Sum(x => x.TotalRendirGeneral);

                var boldStyle = TextStyle.Default.SemiBold();

                table.Cell().Border(1).Padding(3); // Celda vacía
                table.Cell().Border(1).Padding(3).AlignRight().Text(text => text.Span(totalLlevados.ToString("N0")).Style(boldStyle));
                table.Cell().Border(1).Padding(3).AlignRight().Text(text => text.Span(totalDevueltos.ToString("N0")).Style(boldStyle));
                table.Cell().Border(1).Padding(3).AlignRight().Text(text => text.Span(totalVendidos.ToString("N0")).Style(boldStyle));
                table.Cell().Border(1).Padding(3).AlignRight().Text(text => text.Span(totalRendirPub.ToString("C", CultureAr)).Style(boldStyle));
                table.Cell().Border(1).Padding(3).AlignRight().Text(text => text.Span(totalRendirGral.ToString("C", CultureAr)).Style(boldStyle));
            });
        }
    }
}