@page "/HerramientaURBAN"
@using System.Text
@using System.Text.Json
@using HerramientaCASA.Model
@using Microsoft.AspNetCore.WebUtilities
@using Newtonsoft.Json
@using bdHerramientaCACOA.HerramientaURBAN
@using bdHerramientaCACOA.db
@using Microsoft.AspNetCore.Components.Server.ProtectedBrowserStorage
@inject ProtectedLocalStorage ProtectedLocalStore
@inject IJSRuntime JS

@rendermode InteractiveServer
@inject NavigationManager Navigation

<Toasts class="p-3 font-weight-bold" Style="color:white;" AutoHide="true" Delay="4000" Messages="mensajes" Placement="ToastsPlacement.BottomCenter" />
<p class="TituloVentana">
    @TextoSuperior
</p>
@if (!actualizado)
{
    <div class="UpdateCacoa d-flex">
        <span>Esta simulación utiliza valores desactualizados. ¿Quiere Realizar una copia actualizada?</span>
        <button @onclick="@(() => clonarUrban())" class="btnBlue ms-auto">Actualizar</button>
    </div>
 }
<Modal @ref="popupGuardar" title="@TituloBoton" IsVerticallyCentered="true" UseStaticBackdrop="true" CloseOnEscape="false">
    <BodyTemplate>
        <div class="col-12 formatoCampos">

            @if (TituloBoton == "Guardar")
            {
                <p>Se va a <b>guardar</b> esta <b>nueva simulación</b> podrá acceder a ella para consultarla y editarla desde el apartado <b>Mis Simulaciones</b> </p>
            }
            else
            {
                <p>Se van a <b>sobrescribir</b> los datos de la <b>simulación actual</b> con los cambios realizados, <b>esta opción no puede deshacerse.</b><br /><br /> ¿Desea continuar? </p>
            }
        </div>
    </BodyTemplate>
    <FooterTemplate>
        <Button Color="ButtonColor.Secondary" @onclick="cerrarPopupGuardar">Cerrar</Button>
        <Button @onclick="@(() => guardarUrban())" Color="ButtonColor.Primary">@TituloBoton</Button>
    </FooterTemplate>
</Modal>

<div class="container-fluid">
    <div class="d-flex justify-content-between mb-2 mt-2" style="width:100%;position:relative">
        <div class="guardarNombre">
            <button @onclick="@(() => abrirPopupGuardar())" class="btnBlue d-flex align-items-center"> <i class="fas fa-save pe-1"></i>@TituloBoton</button>
            <b class="Fuente2 ps-2 pe-2 nomSim">Nombre de la simulación: </b>
            <InputText @bind-Value="urban.NombreSimulacion" class="form-control inputForm formatoMoneda inputTabla " style="text-align:left;font-weight:bold;"></InputText>
        </div>
        <div class="d-flex ml-auto impriManual">
            @* <button @onclick="imprimir" class="btnBlue d-flex align-items-center ms-1" style="background-color: #65b7c3 !important;"> <i class="fas fa-print pe-2"></i>Imprimir</button> *@
            <button @onclick="VerManual" class="btnBlue d-flex align-items-center ms-1" style="background-color: #65b7c3 !important;"> <i class="fas fa-book pe-2"></i>Manual</button>
        </div>
    </div>
    <Tabs>
        <Tab Title="Despacho Profesional" Name="tabDespachoProf" Active>
            <Content>
                <div class="CajaTab p-2">
                    <HerramientaCASA.Components.Pages.HerramientaURBANTabs.DespachoProfesionalURBAN objetoURBAN="urban"></HerramientaCASA.Components.Pages.HerramientaURBANTabs.DespachoProfesionalURBAN>
                </div>
            </Content>
        </Tab>
        <Tab Title="Trabajo Profesional" Name="tabTrabajoProf">
            <Content>
                <div class="CajaTab p-2">
                    <HerramientaCASA.Components.Pages.HerramientaURBANTabs.TrabProfUrban objetoURBAN="urban"></HerramientaCASA.Components.Pages.HerramientaURBANTabs.TrabProfUrban>
                </div>
            </Content>
        </Tab>
        <Tab Title="Costes de producción" Name="tabCosteProd">
            <Content>
                <div class="CajaTab p-2">
                    <HerramientaCASA.Components.Pages.HerramientaURBANTabs.CostesProduccionURBAN objetoURBAN="urban"></HerramientaCASA.Components.Pages.HerramientaURBANTabs.CostesProduccionURBAN>
                </div>
            </Content>
        </Tab>
    </Tabs>
</div>

<div style="display:none">
    <HerramientaCASA.Components.Pages.Imprimir.HerramientaURBANImprimir objetoURBAN="urban"></HerramientaCASA.Components.Pages.Imprimir.HerramientaURBANImprimir>
</div>
@code {
    [Parameter]
    public string? idSimulador { get; set; } = "";
    public string TextoSuperior = "Nueva simulación CASA de Urbanismo";
    public string TituloBoton = "Guardar";
    private Modal popupGuardar = default!;

    public bool actualizado = true;

    public tsHerramientasCACOA bd;
    private static URBAN urban;
    List<ToastMessage> mensajes = new List<ToastMessage>();

    string nombreOriginal = "";
    private string pdfUrl;

    private int idUser = 0;

    protected override async Task OnInitializedAsync()
    {
        try
        {
            var url = Navigation.ToAbsoluteUri(Navigation.Uri);
            bd = tsHerramientasCACOA.NuevoContexto(SoloLectura: false);



            if (QueryHelpers.ParseQuery(url.Query).TryGetValue("idSimulador", out var clValue))
            {
                idSimulador = clValue;
            }

            if (string.IsNullOrEmpty(idSimulador))
            {
                try
                {
                    urban = new URBAN();
                    urban.RellenarCamposExtra(bd, false);
                }
                catch (Exception ex)
                {
                    var a = ex.Message;
                }
            }
            else
            {

                var fechaActVar = bd.enumeraciones.First(x => x.Codigo == "CW.FECHAULTMOD").Fecha1;
                string idDesencriptado = tsUtilidades.crypt.FEncS(idSimulador,
                           "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890.:/-*",
                           "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890.:/-*",
                           -875421649);

                simulaciones simu = bd.simulaciones.Where(x => x.idSimulacion == int.Parse(idDesencriptado)).First();
                int idFicheroJSON = simu.idFicheroJSON;
                idSimulador = idDesencriptado;
                var byteFichero = bd.ficheros.Where(x => x.idFichero == idFicheroJSON).First().Fichero;

                string CASAJson = System.Text.Encoding.UTF8.GetString(byteFichero);

                urban = System.Text.Json.JsonSerializer.Deserialize<URBAN>(CASAJson);

                if ((simu.FechaModificacion != null && simu.FechaModificacion < fechaActVar) || (simu.FechaModificacion == null && simu.FechaCreacion < fechaActVar))
                {
                    actualizado = false;
                }
                TextoSuperior = "Modificando simulación \"" + simu.Descripcion + "\"";
                TituloBoton = "Modificar";

                nombreOriginal = urban.NombreSimulacion;

            }

            var obtenerID = await ProtectedLocalStore.GetAsync<int>("idUsuario");
            idUser = obtenerID.Value;
        }
        catch (Exception ex)
        {
            Console.WriteLine($"Error durante la inicialización: {ex.Message}");
        }
    }

    private void guardarUrban()
    {
        //HACER
        // para evitar loops
        int idtipoSimulacion = bd.enumeraciones.First(x => x.Codigo == HerramientaCASA.UtilidadesCASA.obtenerTipoSimulacion(HerramientaCASA.UtilidadesCASA.TiposSimulaciones.URBAN)).idEnumeracion;

        // para evitar loops


        string jsonObjeto = Newtonsoft.Json.JsonConvert.SerializeObject(urban);

        if (string.IsNullOrEmpty(idSimulador))
        {
            if (bd.simulaciones.Any(x => x.Descripcion == urban.NombreSimulacion && x.idTipoSimulacion == idtipoSimulacion))
            {
                mensajes.Add(new ToastMessage
                    {
                        Type = ToastType.Danger,
                        Message = $"Ya existe una simulación con el mismo nombre.",
                    });
                cerrarPopupGuardar();
            }
            else
            {
                idSimulador = crearSimulacion(jsonObjeto).ToString();
            }
        }
        else
        {
            var listadoSimulacionesExistentes = bd.simulaciones.Where(x => x.Descripcion != nombreOriginal && x.idTipoSimulacion == idtipoSimulacion).ToList();

            if (listadoSimulacionesExistentes.Any(x => x.Descripcion == urban.NombreSimulacion))
            {
                mensajes.Add(new ToastMessage
                    {
                        Type = ToastType.Danger,
                        Message = $"Ya existe una simulación con el mismo nombre.",
                    });
                cerrarPopupGuardar();
            }
            else
            {
                actualizarSimulacion(jsonObjeto);
            }
        }

        HerramientaCASA.UtilidadesCASA.guardarEstadisticas(bd, HerramientaCASA.UtilidadesCASA.TiposSimulaciones.URBAN, jsonObjeto, int.Parse(idSimulador));
    }
    private int crearSimulacion(string jsonObjeto)
    {
        int idSimulacionCreada = UtilidadesCASA.crearObjeto(bd, HerramientaCASA.UtilidadesCASA.TiposSimulaciones.URBAN, jsonObjeto, urban.NombreSimulacion, "urban.json", idUser);
        string link = "/HerramientaURBAN?idSimulador=" + tsUtilidades.crypt.FEncS(idSimulacionCreada.ToString(), "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890.:/-*", "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890.:/-*", 875421649);
        mensajes.Add(new ToastMessage
            {
                Type = ToastType.Primary,
                Message = $"Simulación creada correctamente.",
            });

        Navigation.NavigateTo(link, true);

        return idSimulacionCreada;
    }
    private void actualizarSimulacion(string jsonObjeto)
    {
        UtilidadesCASA.actualziarObjeto(bd, jsonObjeto, urban.NombreSimulacion, idSimulador);
        cerrarPopupGuardar();
        mensajes.Add(new ToastMessage
            {
                Type = ToastType.Primary,
                Message = $"Simulación actualizada correctamente.",
            });
    }

    private void clonarUrban()
    {
        urban.RellenarCamposExtra(bd, true);
        urban.CalcularFinales();
        urban.NombreSimulacion = urban.NombreSimulacion + " (Act:" + DateTime.Now + ")";
        string jsonObjeto = Newtonsoft.Json.JsonConvert.SerializeObject(urban);
        var id = UtilidadesCASA.crearObjeto(bd, HerramientaCASA.UtilidadesCASA.TiposSimulaciones.URBAN, jsonObjeto, urban.NombreSimulacion, "urban.json", idUser);

        var link = "/HerramientaURBAN?idSimulador=" + tsUtilidades.crypt.FEncS(id.ToString(), "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890.:/-*", "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890.:/-*", 875421649);

        Navigation.NavigateTo(link, true);
    }
   

    public void RefreshState()
    {
        this.StateHasChanged();
    }

    private async Task abrirPopupGuardar()
    {
        await popupGuardar.ShowAsync();
    }
    private async Task cerrarPopupGuardar()
    {
        await popupGuardar.HideAsync();
    }

    private async Task VerManual()
    {
        string urlManual = bd.enumeraciones.FirstOrDefault(x => x.Codigo.Contains("MANUAL.HERRAMIENTAURBAN")).ValorAlfabeticoLargo;
        await JS.InvokeVoidAsync("abrirManual", urlManual);
    }

    // private async Task imprimir()
    // {
    //     var cssPath = Path.Combine(Environment.CurrentDirectory, "wwwroot", "Content", "Site.css");
    //     var cssContent = await File.ReadAllTextAsync(cssPath);

    //     var contenidoHtml = await JS.InvokeAsync<string>("obtenerPDFImprimir", "DespachoURBANImprimir");
    //     var fullHtml = $@"
    // <html>
    //     <head>
    //         <style>{cssContent}</style>
    //         <link href='https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css' rel='stylesheet' integrity='sha384-T3c6CoIi6uLrA9TneNEoa7RxnatzjcDSCmG1MXxSR1GAsXEV/Dwwykc2MPK8M2HN' crossorigin='anonymous'>
    //     </head>
    //     <body>
    // {contenidoHtml}
    //     </body>
    // </html>";

    //     var fileName = $"factura_{DateTime.Now:yyyyMMddHHmmss}.pdf";
    //     var filePath = Path.Combine("wwwroot", fileName);

    //     // var browserFetcher = new BrowserFetcher();
    //     // var revisionInfo = await browserFetcher.DownloadAsync();

    //     var chromiumPath = Path.Combine(Environment.CurrentDirectory, "wwwroot", "chrome-win", "chrome.exe");


    //     var browser = await Puppeteer.LaunchAsync(new LaunchOptions
    //     {
    //         ExecutablePath = chromiumPath,
    //         Headless = true,
    //         Args = new[] { "--no-sandbox", "--disable-setuid-sandbox", "--ignore-certificate-errors" }
    //     });

    //     using var page = await browser.NewPageAsync();

    //     await page.SetViewportAsync(new ViewPortOptions { Width = 1200, Height = 800 });

    //     await page.SetContentAsync(fullHtml);

    //     var pdfBytes = await page.PdfDataAsync(new PdfOptions
    //     {
    //         PrintBackground = true,
    //         Format = PuppeteerSharp.Media.PaperFormat.A4,
    //         MarginOptions = new PuppeteerSharp.Media.MarginOptions
    //         {
    //             Top = "20mm",
    //             Bottom = "10mm"
    //         },
    //         DisplayHeaderFooter = true,
    //         HeaderTemplate = @"
    //             <style>
    //                 html {
    //                   -webkit-print-color-adjust: exact;
    //                 }
    //                 #header, #footer { padding: 0 !important; }
    //             </style>
    //             <div style='width:100%; font-size:12px; color:#078b98; font-weight:bold; padding:5px 10px;background-color: #D7ECEF;'>
    //               <table style='width:100%; border:0; border-collapse:collapse;'>
    //                 <tr>
    //                   <td style='text-align:left; width:50%;'>
    //                         <img style='height: 40px; border-radius: 10px !important;' src='data:image/jpeg;base64,/9j/4AAQSkZJRgABAgEBLAEsAAD/4QoERXhpZgAATU0AKgAAAAgABwESAAMAAAABAAEAAAEaAAUAAAABAAAAYgEbAAUAAAABAAAAagEoAAMAAAABAAIAAAExAAIAAAAVAAAAcgEyAAIAAAAUAAAAh4dpAAQAAAABAAAAnAAAAMgAAAEsAAAAAQAAASwAAAABQWRvYmUgUGhvdG9zaG9wIDcuMCAAMjAyMjowMjowNCAxMzozMTozMAAAAAOgAQADAAAAAQABAACgAgAEAAAAAQAABACgAwAEAAAAAQAAAXIAAAAAAAAABgEDAAMAAAABAAYAAAEaAAUAAAABAAABFgEbAAUAAAABAAABHgEoAAMAAAABAAIAAAIBAAQAAAABAAABJgICAAQAAAABAAAI1gAAAAAAAABIAAAAAQAAAEgAAAAB / 9j / 4AAQSkZJRgABAgEASABIAAD / 7QAMQWRvYmVfQ00AAf / uAA5BZG9iZQBkgAAAAAH / 2wCEAAwICAgJCAwJCQwRCwoLERUPDAwPFRgTExUTExgRDAwMDAwMEQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwBDQsLDQ4NEA4OEBQODg4UFA4ODg4UEQwMDAwMEREMDAwMDAwRDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDP / AABEIAC4AgAMBIgACEQEDEQH / 3QAEAAj / xAE / AAABBQEBAQEBAQAAAAAAAAADAAECBAUGBwgJCgsBAAEFAQEBAQEBAAAAAAAAAAEAAgMEBQYHCAkKCxAAAQQBAwIEAgUHBggFAwwzAQACEQMEIRIxBUFRYRMicYEyBhSRobFCIyQVUsFiMzRygtFDByWSU / Dh8WNzNRaisoMmRJNUZEXCo3Q2F9JV4mXys4TD03Xj80YnlKSFtJXE1OT0pbXF1eX1VmZ2hpamtsbW5vY3R1dnd4eXp7fH1 + f3EQACAgECBAQDBAUGBwcGBTUBAAIRAyExEgRBUWFxIhMFMoGRFKGxQiPBUtHwMyRi4XKCkkNTFWNzNPElBhaisoMHJjXC0kSTVKMXZEVVNnRl4vKzhMPTdePzRpSkhbSVxNTk9KW1xdXl9VZmdoaWprbG1ub2JzdHV2d3h5ent8f / 2gAMAwEAAhEDEQA / APUrba6Wb7XBrZiT5oX7Qwv9M1B6w9jMIue4NG5upMDlYn2jH / 0rP84J8YWLYcmXhlWm3V6FudiOcGttaSeAievT++Fz2PkY / r1 / pWc / vDwWh9pxv9Mz / OCRhXdUc1jo6IvqJgOGqIstmRjl7QLWElwAG4eK1E0imSMuK1Ifrs8H / wCY7 / yKIoW + p6T / AEo9Tadk8bo9qCTa3rs8H / 5j / wDyKXrs8H / 5j / 8AyKw6b7qKWOxBkhxY31zcx75yA0xRts9zH3v / AKVcz9B / N / 4WxFOd1ZhY61rocWPcxtR3e43NOPW47q / b6VO71X1fzn87X + jYn8DEM3cfYLDr + uzwf / mP / [encoded data, 114243 characters]' alt='Image'>
    //                   </td>
    //                   <td style='text-align:right; width:50%;'>
    //                         Costes Asociados a los Servicios de Arquitectura - CASA
    //                   </td>
    //                 </tr>
    //               </table>
    //             </div>",
    //         FooterTemplate = @"
    //             <div style='font-size:10px; width:100%; text-align:center;margin-bottom:5px;'>
    //                 Página <span class='pageNumber'></span> de <span class='totalPages'></span>
    //             </div>"
    //     });

    //     await JS.InvokeVoidAsync("mostrarPdf", Convert.ToBase64String(pdfBytes));
    // }

}
