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 FacturasPublicidadDocument : IDocument
    {
        public FacturasPublicidadViewModel Model { get; }

        public FacturasPublicidadDocument(FacturasPublicidadViewModel model)
        {
            Model = model;
        }

        public DocumentMetadata GetMetadata() => DocumentMetadata.Default;

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

        void ComposeHeader(IContainer container)
        {
            // Se envuelve todo el contenido del header en una única Columna.
            container.Column(column =>
            {
                // El primer item de la columna es la fila con los títulos.
                column.Item().Row(row =>
                {
                    row.RelativeItem().Column(col =>
                    {
                        col.Item().Text($"Reporte de Suscripciones a Facturar").SemiBold().FontSize(14);
                        col.Item().Text($"Período: {Model.Periodo}").FontSize(11);
                    });

                    row.ConstantItem(150).AlignRight().Column(col => {
                        col.Item().AlignRight().Text($"Fecha de Generación:");
                        col.Item().AlignRight().Text(Model.FechaGeneracion);
                    });
                });

                // El segundo item de la columna es el separador.
                column.Item().PaddingTop(5).BorderBottom(1).BorderColor(Colors.Grey.Lighten2);
            });
        }

        void ComposeContent(IContainer container)
        {
            container.PaddingTop(10).Column(column =>
            {
                column.Spacing(20);

                foreach (var empresaData in Model.DatosPorEmpresa)
                {
                    column.Item().Element(c => ComposeTablaPorEmpresa(c, empresaData));
                }
                
                column.Item().AlignRight().PaddingTop(15).Text($"Total General a Facturar: {Model.TotalGeneral.ToString("C", new CultureInfo("es-AR"))}").Bold().FontSize(12);
            });
        }

        void ComposeTablaPorEmpresa(IContainer container, DatosEmpresaViewModel empresaData)
        {
            container.Table(table =>
            {
                table.ColumnsDefinition(columns =>
                {
                    columns.RelativeColumn(3); // Nombre Suscriptor
                    columns.ConstantColumn(100); // Documento
                    columns.ConstantColumn(100, Unit.Point); // Importe
                });

                table.Header(header =>
                {
                    header.Cell().ColumnSpan(3).Background(Colors.Grey.Lighten2)
                        .Padding(5).Text(empresaData.NombreEmpresa).Bold().FontSize(12);
                    
                    header.Cell().BorderBottom(1).BorderColor(Colors.Grey.Lighten3).Padding(2).Text("Suscriptor").SemiBold();
                    header.Cell().BorderBottom(1).BorderColor(Colors.Grey.Lighten3).Padding(2).Text("Documento").SemiBold();
                    header.Cell().BorderBottom(1).BorderColor(Colors.Grey.Lighten3).Padding(2).AlignRight().Text("Importe a Facturar").SemiBold();
                });
                
                var facturasPorSuscriptor = empresaData.Facturas.GroupBy(f => f.NombreSuscriptor);

                foreach (var grupoSuscriptor in facturasPorSuscriptor.OrderBy(g => g.Key))
                {
                    foreach(var item in grupoSuscriptor)
                    {
                        table.Cell().Padding(2).Text(item.NombreSuscriptor);
                        table.Cell().Padding(2).Text($"{item.TipoDocumento} {item.NroDocumento}");
                        table.Cell().Padding(2).AlignRight().Text(item.ImporteFinal.ToString("C", new CultureInfo("es-AR")));
                    }

                    if(grupoSuscriptor.Count() > 1)
                    {
                        var subtotal = grupoSuscriptor.Sum(i => i.ImporteFinal);
                        table.Cell().ColumnSpan(2).AlignRight().Padding(2).Text($"Subtotal {grupoSuscriptor.Key}:").Italic();
                        table.Cell().AlignRight().Padding(2).Text(subtotal.ToString("C", new CultureInfo("es-AR"))).Italic().SemiBold();
                    }
                }
                
                table.Cell().ColumnSpan(2).BorderTop(1).BorderColor(Colors.Grey.Darken1).AlignRight()
                    .PaddingTop(5).Text("Total Empresa:").Bold();
                table.Cell().BorderTop(1).BorderColor(Colors.Grey.Darken1).AlignRight()
                    .PaddingTop(5).Text(empresaData.TotalEmpresa.ToString("C", new CultureInfo("es-AR"))).Bold();
            });
        }
    }
}