using DinkToPdf;
using DinkToPdf.Contracts;
using System.Text;
namespace HerramientaCASA
{
    public class ServicioPDF
    {
        private readonly IConverter _converter;

        public ServicioPDF(IConverter converter)
        {
            _converter = converter;
        }

        public byte[] GenerarPdf(string html)
        {
            var doc = new HtmlToPdfDocument()
            {
                GlobalSettings = {
                PaperSize = PaperKind.A4,
                Orientation = Orientation.Portrait,
            },
                Objects = {
                new ObjectSettings() {
                    HtmlContent = html,
                    WebSettings = { DefaultEncoding = "utf-8", UserStyleSheet = Path.Combine(Environment.CurrentDirectory, "wwwroot", "Content", "Site.css") }
                }
            }
            };

            return _converter.Convert(doc);
        }



        //    /// <summary>
        //    /// Convierte HTML a PDF (bytes) usando HtmlRenderer.PdfSharpCore, inyectando site.css.

        //    /// </summary>
        //    /// <param name="htmlBody">
        //    /// Contenido HTML del body (o el documento completo). Si pasas solo el body, se envolverá automáticamente.
        //    /// </param>
        //    /// <param name="siteCssPath">Ruta al archivo site.css en el servidor (p. ej. "wwwroot/css/site.css").</param>
        //    /// <param name="baseUri">
        //    /// (Opcional) Base para resolver rutas relativas.
        //    /// Se inserta como &lt;base href="..."&gt; en &lt;head&gt;.
        //    /// </param>
        //    /// <param name="pageSize">Tamaño de página (A4 por defecto).</param>
        //    /// <param name="margin">Margen en puntos (40 por defecto).</param>
        //    public  byte[] HtmlToPdfWithSiteCss(
        //        string htmlBody,
        //        string siteCssPath,
        //        string? baseUri = null,
        //        PdfSharpCore.PageSize pageSize = PdfSharpCore.PageSize.A4,
        //        int margin = 40
        //    )
        //    {
        //        if (string.IsNullOrWhiteSpace(htmlBody))
        //            throw new ArgumentException("El HTML no puede estar vacío.", nameof(htmlBody));

        //        if (string.IsNullOrWhiteSpace(siteCssPath) || !File.Exists(siteCssPath))
        //            throw new FileNotFoundException("No se encontró el archivo CSS indicado.", siteCssPath);

        //        // Evitar problemas de codificación (tildes, ñ)
        //        Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);

        //        // Lee el CSS local
        //        var css = File.ReadAllText(siteCssPath);

        //        // HTML mínimo
        //        bool isFullHtml = htmlBody.Contains("<html", StringComparison.OrdinalIgnoreCase);
        //        string headExtras = $"<meta charset='utf-8'><style>{css}</style>";
        //        if (!string.IsNullOrWhiteSpace(baseUri))
        //            headExtras = $"<base href=\"{baseUri}\">{headExtras}";

        //        string fullHtml = isFullHtml
        //            ? InjectIntoHead(htmlBody, headExtras)
        //            : $"<!doctype html><html><head>{headExtras}</head><body>{htmlBody}</body></html>";

        //        var cfg = new PdfGenerateConfig
        //        {
        //            PageSize = (PdfSharp.PageSize)pageSize,
        //            MarginLeft = margin,
        //            MarginRight = margin,
        //            MarginTop = margin,
        //            MarginBottom = margin
        //        };

        //        using var doc = PdfGenerator.GeneratePdf(fullHtml, cfg);
        //        using var ms = new MemoryStream();
        //        doc.Save(ms);
        //        return ms.ToArray();

        //        // Inserta contenido en <head> (si existe); si no, lo crea.
        //        static string InjectIntoHead(string html, string toInject)
        //        {
        //            int headOpen = html.IndexOf("<head", StringComparison.OrdinalIgnoreCase);
        //            if (headOpen >= 0)
        //            {
        //                int headClose = html.IndexOf('>', headOpen);
        //                if (headClose > headOpen)
        //                {
        //                    return html.Insert(headClose + 1, toInject);
        //                }
        //            }
        //            // No hay <head>, lo creamos
        //            int htmlOpen = html.IndexOf("<html", StringComparison.OrdinalIgnoreCase);
        //            if (htmlOpen >= 0)
        //            {
        //                int htmlTagEnd = html.IndexOf('>', htmlOpen);
        //                if (htmlTagEnd > htmlOpen)
        //                {
        //                    return html.Insert(htmlTagEnd + 1, $"<head>{toInject}</head>");
        //                }
        //            }
        //            // Documento raro: envolvemos completo
        //            return $"<!doctype html><html><head>{toInject}</head><body>{html}</body></html>";
        //        }
        //    }
        //}
    }
}