using Microsoft.Extensions.Logging;
using QuestPDF.Fluent;
using QuestPDF.Infrastructure;
using System;
using System.Threading.Tasks;

namespace GestionIntegral.Api.Services.Pdf
{
    // Una interfaz simple para mantener la inyección de dependencias
    public interface IQuestPdfGenerator
    {
        Task<byte[]> GeneratePdfAsync(IDocument document);
    }

    public class QuestPdfGenerator : IQuestPdfGenerator
    {
        private readonly ILogger<QuestPdfGenerator> _logger;

        public QuestPdfGenerator(ILogger<QuestPdfGenerator> logger)
        {
            _logger = logger;
            
            // --- Configuración de la licencia ---
            QuestPDF.Settings.License = LicenseType.Community;
            _logger.LogInformation("QuestPDF inicializado con licencia Community.");
        }

        public async Task<byte[]> GeneratePdfAsync(IDocument document)
        {
            _logger.LogInformation("Generando PDF con QuestPDF para el documento de tipo {DocumentType}.", document.GetType().Name);
            try
            {
                // GeneratePdf() es síncrono, pero lo envolvemos en un Task para mantener la interfaz asíncrona.
                byte[] pdfBytes = await Task.Run(() => document.GeneratePdf());
                
                _logger.LogInformation("PDF generado exitosamente con QuestPDF ({Length} bytes).", pdfBytes.Length);
                return pdfBytes;
            }
            catch (Exception ex)
            {
                _logger.LogError(ex, "Error durante la generación del PDF con QuestPDF.");
                throw;
            }
        }
    }
}