using System.Collections.Generic;
using System.IO;
using System.Linq;
using QuestPDF.Fluent;
using QuestPDF.Helpers;
using QuestPDF.Infrastructure;

namespace TableMagic.Cli.Excel;

internal static class PdfExporter
{
    static PdfExporter()
    {
        QuestPDF.Settings.License = LicenseType.Community;
    }

    public static void ExportSheet(List<string[]> data, string sheetName, string pdfPath)
    {
        if (data.Count == 0)
        {
            Document.Create(container =>
            {
                container.Page(page =>
                {
                    page.Size(PageSizes.A4);
                    page.Margin(1, Unit.Centimetre);
                    page.Content().Text("(空工作表)");
                });
            }).GeneratePdf(pdfPath);
            return;
        }

        var colCount = data[0].Length;
        var headerRow = data[0];
        var bodyRows = data.Skip(1).ToList();

        Document.Create(container =>
        {
            container.Page(page =>
            {
                page.Size(PageSizes.A4.Landscape());
                page.Margin(1, Unit.Centimetre);
                page.Header().Text(sheetName).FontSize(14).Bold();
                page.Content().Table(table =>
                {
                    table.ColumnsDefinition(columns =>
                    {
                        for (int i = 0; i < colCount; i++)
                            columns.RelativeColumn();
                    });

                    table.Header(header =>
                    {
                        for (int c = 0; c < colCount; c++)
                        {
                            header.Cell().Element(CellStyle).Text(headerRow[c]);
                        }
                    });

                    foreach (var row in bodyRows)
                    {
                        for (int c = 0; c < colCount; c++)
                        {
                            var cellText = c < row.Length ? row[c] : "";
                            table.Cell().Element(CellStyle).Text(cellText);
                        }
                    }
                });
            });
        }).GeneratePdf(pdfPath);
    }

    public static void ExportWorkbook(List<(string Name, List<string[]> Data)> sheets, string pdfPath)
    {
        Document.Create(container =>
        {
            foreach (var (sheetName, data) in sheets)
            {
                container.Page(page =>
                {
                    page.Size(PageSizes.A4.Landscape());
                    page.Margin(1, Unit.Centimetre);
                    page.Header().Text(sheetName).FontSize(14).Bold();

                    if (data.Count == 0)
                    {
                        page.Content().Text("(空工作表)");
                        return;
                    }

                    var colCount = data[0].Length;
                    var headerRow = data[0];
                    var bodyRows = data.Skip(1).ToList();

                    page.Content().Table(table =>
                    {
                        table.ColumnsDefinition(columns =>
                        {
                            for (int i = 0; i < colCount; i++)
                                columns.RelativeColumn();
                        });

                        table.Header(header =>
                        {
                            for (int c = 0; c < colCount; c++)
                            {
                                header.Cell().Element(CellStyle).Text(headerRow[c]);
                            }
                        });

                        foreach (var row in bodyRows)
                        {
                            for (int c = 0; c < colCount; c++)
                            {
                                var cellText = c < row.Length ? row[c] : "";
                                table.Cell().Element(CellStyle).Text(cellText);
                            }
                        }
                    });
                });
            }
        }).GeneratePdf(pdfPath);
    }

    private static IContainer CellStyle(IContainer container)
    {
        return container.Border(1).BorderColor(Colors.Grey.Lighten2).PaddingVertical(2).PaddingHorizontal(4);
    }
}