using QuestPDF.Fluent;
using QuestPDF.Helpers;
using QuestPDF.Infrastructure;
using SIGCM.Domain.Entities;
using SIGCM.Domain.Models;

namespace SIGCM.Infrastructure.Services;

public static class ReportGenerator
{
  public static byte[] GenerateSalesPdf(GlobalReportDto data, string title)
  {
    return Document.Create(container =>
    {
      container.Page(page =>
          {
            page.Size(PageSizes.A4);
            page.Margin(1, Unit.Centimetre);
            page.PageColor(Colors.White);
            page.DefaultTextStyle(x => x.FontSize(10).FontFamily("Helvetica"));

            // --- ENCABEZADO ---
            page.Header().Row(row =>
                {
                  row.RelativeItem().Column(col =>
                    {
                      col.Item().Text("DIARIO EL DIA").FontSize(20).SemiBold().FontColor(Colors.Blue.Medium);
                      col.Item().Text("Sistema de Gestión de Avisos").FontSize(9).Italic();
                    });

                  row.RelativeItem().AlignRight().Column(col =>
                    {
                      col.Item().Text(title).FontSize(14).SemiBold();
                      col.Item().Text($"Periodo: {data.FromDate:dd/MM/yyyy} - {data.ToDate:dd/MM/yyyy}").FontSize(9);
                      col.Item().Text($"Generado: {DateTime.Now:dd/MM/yyyy HH:mm}").FontSize(8).FontColor(Colors.Grey.Medium);
                    });
                });

            // --- CONTENIDO ---
            page.Content().PaddingVertical(20).Column(col =>
                {
                  // Resumen de KPIs en el PDF
                  col.Item().Row(row =>
                    {
                      row.RelativeItem().Border(1).BorderColor(Colors.Grey.Lighten2).Padding(10).Column(c =>
                    {
                      c.Item().Text("TOTAL RECAUDADO").FontSize(8).SemiBold();
                      c.Item().Text($"${data.TotalRevenue:N2}").FontSize(16).Black();
                    });
                      row.ConstantItem(10);
                      row.RelativeItem().Border(1).BorderColor(Colors.Grey.Lighten2).Padding(10).Column(c =>
                    {
                      c.Item().Text("CANTIDAD DE AVISOS").FontSize(8).SemiBold();
                      c.Item().Text($"{data.TotalAds}").FontSize(16).Black();
                    });
                    });

                  col.Item().PaddingTop(20);

                  // Tabla de detalles
                  col.Item().Table(table =>
                    {
                      table.ColumnsDefinition(columns =>
                        {
                          columns.ConstantColumn(40); // ID
                          columns.ConstantColumn(80); // Fecha
                          columns.RelativeColumn();   // Titulo
                          columns.RelativeColumn();   // Rubro
                          columns.RelativeColumn();   // Cajero
                          columns.ConstantColumn(70); // Monto
                        });

                      // Encabezado de tabla
                      table.Header(header =>
                        {
                          header.Cell().Element(CellStyle).Text("ID");
                          header.Cell().Element(CellStyle).Text("FECHA");
                          header.Cell().Element(CellStyle).Text("TITULO");
                          header.Cell().Element(CellStyle).Text("RUBRO");
                          header.Cell().Element(CellStyle).Text("CAJERO");
                          header.Cell().Element(CellStyle).AlignRight().Text("MONTO");

                          static IContainer CellStyle(IContainer container) => container.DefaultTextStyle(x => x.SemiBold()).PaddingVertical(5).BorderBottom(1).BorderColor(Colors.Black);
                        });

                      // Filas
                      foreach (var item in data.Items)
                      {
                        table.Cell().Element(RowStyle).Text(item.Id.ToString());
                        table.Cell().Element(RowStyle).Text(item.Date.ToString("dd/MM HH:mm"));
                        table.Cell().Element(RowStyle).Text(item.Title);
                        table.Cell().Element(RowStyle).Text(item.Category);
                        table.Cell().Element(RowStyle).Text(item.Cashier);
                        table.Cell().Element(RowStyle).AlignRight().Text($"${item.Amount:N2}");

                        static IContainer RowStyle(IContainer container) => container.PaddingVertical(5).BorderBottom(1).BorderColor(Colors.Grey.Lighten4);
                      }
                    });
                });

            // --- PIE DE PAGINA ---
            page.Footer().AlignCenter().Text(x =>
                {
                  x.Span("Página ");
                  x.CurrentPageNumber();
                });
          });
    }).GeneratePdf();
  }

  public static byte[] GenerateCashSessionPdf(CashSession session)
  {
    return Document.Create(container =>
    {
      container.Page(page =>
          {
          page.Size(PageSizes.A4);
          page.Margin(1.5f, Unit.Centimetre);
          page.PageColor(Colors.White);
          page.DefaultTextStyle(x => x.FontSize(10).FontFamily("Helvetica"));

            // --- ENCABEZADO ---
          page.Header().Row(row =>
              {
              row.RelativeItem().Column(col =>
                  {
                  col.Item().Text("DIARIO EL DIA").FontSize(22).Black().SemiBold();
                  col.Item().Text("SISTEMA INTEGRAL DE GESTIÓN (SIG-CM)").FontSize(9).Italic().FontColor(Colors.Grey.Medium);
                });

              row.RelativeItem().AlignRight().Column(col =>
                  {
                  col.Item().Text("ACTA DE CIERRE DE CAJA").FontSize(14).SemiBold().FontColor(Colors.Blue.Medium);
                  col.Item().Text($"SESIÓN ID: #{session.Id.ToString().PadLeft(6, '0')}").FontSize(10).Bold();
                  col.Item().Text($"Estado: {session.Status.ToUpper()}").FontSize(8);
                });
            });

            // --- CONTENIDO ---
          page.Content().PaddingVertical(20).Column(col =>
              {
                // Bloque de Información General
              col.Item().Border(1).BorderColor(Colors.Grey.Lighten2).Padding(10).Row(row =>
                  {
                  row.RelativeItem().Column(c =>
                  {
                    c.Item().Text("CAJERO RESPONSABLE").FontSize(8).Bold().FontColor(Colors.Grey.Medium);
                    c.Item().Text(session.Username?.ToUpper() ?? "N/A").FontSize(12).Black();
                  });
                  row.RelativeItem().Column(c =>
                  {
                    c.Item().Text("APERTURA").FontSize(8).Bold().FontColor(Colors.Grey.Medium);
                    c.Item().Text(session.OpeningDate.ToLocalTime().ToString("G")).FontSize(10);
                  });
                  row.RelativeItem().Column(c =>
                  {
                    c.Item().Text("CIERRE").FontSize(8).Bold().FontColor(Colors.Grey.Medium);
                    c.Item().Text(session.ClosingDate?.ToLocalTime().ToString("G") ?? "EN CURSO").FontSize(10);
                  });
                });

              col.Item().PaddingTop(25).Text("RESUMEN DE VALORES").FontSize(12).SemiBold().Underline();

                // Tabla de Liquidación
              col.Item().PaddingTop(10).Table(table =>
                  {
                  table.ColumnsDefinition(columns =>
                      {
                      columns.RelativeColumn();
                      columns.ConstantColumn(100);
                    });

                  table.Cell().Element(RowStyle).Text("FONDO INICIAL DE APERTURA");
                  table.Cell().Element(RowStyle).AlignRight().Text($"$ {session.OpeningBalance:N2}");

                  table.Cell().Element(RowStyle).Text("RECAUDACIÓN EFECTIVO (VENTAS)");
                  table.Cell().Element(RowStyle).AlignRight().Text($"$ {session.SystemExpectedCash:N2}");

                  table.Cell().Element(RowStyle).Text("RECAUDACIÓN TARJETAS (DÉBITO/CRÉDITO)");
                  table.Cell().Element(RowStyle).AlignRight().Text($"$ {session.SystemExpectedCards:N2}");

                  table.Cell().Element(RowStyle).Text("RECAUDACIÓN TRANSFERENCIAS");
                  table.Cell().Element(RowStyle).AlignRight().Text($"$ {session.SystemExpectedTransfers:N2}");

                    // Total Final
                  table.Cell().PaddingTop(5).Text("TOTAL GENERAL A ENTREGAR").Bold().FontSize(12);
                  decimal total = session.OpeningBalance + (session.SystemExpectedCash ?? 0) + (session.SystemExpectedCards ?? 0) + (session.SystemExpectedTransfers ?? 0);
                  table.Cell().PaddingTop(5).AlignRight().Text($"$ {total:N2}").Bold().FontSize(12);

                  static IContainer RowStyle(IContainer container) => container.PaddingVertical(5).BorderBottom(1).BorderColor(Colors.Grey.Lighten4);
                });

                // Diferencias (si existen)
              if (session.TotalDifference != 0)
              {
                col.Item().PaddingTop(20).Background(Colors.Grey.Lighten4).Padding(10).Row(row =>
                {
                  row.RelativeItem().Text("DIFERENCIA DETECTADA EN ARQUEO:").Bold();
                  row.RelativeItem().AlignRight().Text($"$ {session.TotalDifference:N2}").Bold().FontColor(session.TotalDifference > 0 ? Colors.Green.Medium : Colors.Red.Medium);
                });
              }

                // Espacio para Observaciones
              col.Item().PaddingTop(30).Column(c =>
              {
                c.Item().Text("OBSERVACIONES:").FontSize(8).Bold();
                c.Item().MinHeight(50).Border(0.5f).BorderColor(Colors.Grey.Lighten2).Padding(5).Text(session.ValidationNotes ?? "Sin observaciones adicionales.");
              });

                // --- SECCIÓN DE FIRMAS ---
              col.Item().PaddingTop(60).Row(row =>
                  {
                  row.RelativeItem().Column(c =>
                  {
                    c.Item().PaddingTop(10).BorderTop(1).AlignCenter().Text("FIRMA CAJERO").FontSize(9);
                    c.Item().AlignCenter().Text(session.Username?.ToUpper()).FontSize(7);
                  });
                  row.ConstantItem(50);
                  row.RelativeItem().Column(c =>
                  {
                    c.Item().PaddingTop(10).BorderTop(1).AlignCenter().Text("FIRMA SUPERVISOR / TESORERÍA").FontSize(9);
                    c.Item().AlignCenter().Text(session.ValidatorName?.ToUpper() ?? "ACLARACIÓN").FontSize(7);
                  });
                });
            });

            // --- PIE DE PÁGINA ---
          page.Footer().AlignCenter().Text(x =>
              {
              x.Span("Documento generado por SIG-CM el ");
              x.Span(DateTime.Now.ToString("dd/MM/yyyy HH:mm:ss"));
              x.Span(" - Página ");
              x.CurrentPageNumber();
            });
        });
    }).GeneratePdf();
  }
}