@using HerramientaCASA.Components.Pages.Comun
@using HerramientaCASA.Model
@using Microsoft.AspNetCore.WebUtilities
@using Microsoft.EntityFrameworkCore
@using bdHerramientaCACOA.db
@using HerramientaCASA.Components.Pages.LicitacionesGrids
@using PuppeteerSharp
@using Microsoft.AspNetCore.Components.Server.ProtectedBrowserStorage
@inject ProtectedLocalStorage ProtectedLocalStore
@inject IJSRuntime JS

@page "/LicitacionCASA"
@page "/LicitacionCASA/{idSimulador}"

@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="@(() => clonarLicitacion())" 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="@(() => guardarLicitacion())" Color="ButtonColor.Primary">@TituloBoton</Button>
    </FooterTemplate>
</Modal>
<div class="container-fluid pt-3">

    <div class="d-flex" style="width:100%">
        <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="objetoLicitaciones.Descripcion" class="form-control inputForm formatoMoneda inputTabla " style="text-align:left;font-weight:bold;"></InputText>
        <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>

@*     <Button @onclick="imprimir">Imprimir</Button> *@

    <div class="row">
        <div class="col-md-6 mt-3 mb-2">
            <div><b>Convenio Colectivo:</b></div>
            <InputSelect @bind-Value="@objetoLicitaciones.idProvincia" class="inputForm" @oninput="e => CalcularTabla(e.Value.ToString())" style="width: 225px;">
                <option value="">Estatal</option>
                <option value="04">Almería</option>
                <option value="11">Cádiz</option>
                <option value="14">Córdoba</option>
                <option value="18">Granada</option>
                <option value="15">Huelva</option>
                <option value="29">Málaga</option>
                <option value="41">Sevilla</option>
            </InputSelect>
        </div>
        <div class="col-md-12 d-flex mt-3" style="gap: 40px;">
            <RadioInput style="margin-right: 10px;" Label="Cálculo por superficie y uso" Value="modificarTabla" ValueExpression="() => modificarTabla" ValueChanged="(value) => modificarTablaChanged(value)" />
            <RadioInput style="margin-right: 10px;" Label="Cálculo por tiempo" Value="modificarHoras" ValueExpression="() => modificarHoras" ValueChanged="(value) => modificarHorasChanged(value)" />
        </div>
        @if (modificarTabla)
        {
        <div class="col-md-12 mt-3 mb-5">
            <CascadingValue Value="this">
                <TrabajoProfLicitacionesGrid objetoLicitaciones="objetoLicitaciones"></TrabajoProfLicitacionesGrid>
            </CascadingValue>
        </div>

        }
    </div>
    <div class="row">
            <div class="col-md-3">
                <CascadingValue Value="this">
                    <FasesTrabajoLicitaciones objetoLicitaciones="objetoLicitaciones"></FasesTrabajoLicitaciones>
                </CascadingValue>
            </div>

        <div class="col-md-5">
            <CascadingValue Value="this">
                <CostesProLicitaciones objetoLicitaciones="objetoLicitaciones"></CostesProLicitaciones>
            </CascadingValue>
        </div>

        <div class="col-md-4">
            <CascadingValue Value="this">
                <OtrosTrabajos objetoLicitaciones="objetoLicitaciones"></OtrosTrabajos>
            </CascadingValue>

            <div style="margin-top:32px">

                <table class="table tablaCACOA tablaCACOA2 mb-0" style="width: 100%;">
                    <tfoot>
                        <tr>
                            <td colspan="2" class="text-end fw-bold TotalesTabla">
                                Presupuesto base de licitación:  <span>@objetoLicitaciones.PrecioDelEncargo.MilesYDecimales() € </span>
                            </td>
                        </tr>
                    </tfoot>
                </table>
            </div>
        </div>
    </div>
    <div style="display:none">
        <HerramientaCASA.Components.Pages.Imprimir.LicitacionesCASAImprimir objetoLicitaciones="objetoLicitaciones"></HerramientaCASA.Components.Pages.Imprimir.LicitacionesCASAImprimir>
    </div>
    @*  <div class="row">
        <div class="col-md-12">
            <table class="tablaAlter mt-3 mb-3">
                <tr>
                    <td class="tdAlter">PRECIO LICITACIÓN / CONCURSO: </td>
                    <td class="tdAlineadoDerecha"> @objetoLicitaciones.PrecioDelEncargo.MilesYDecimales() €</td>
                </tr>
            </table>
        </div>
    </div> *@
    <div class="pt-5  " style="margin-top:2000px;">
        <p><b>Datos configuración para revisión de datos</b></p>
        <b>superficie</b> @objetoLicitaciones.superficie;<br />
        <b>Coef sup total</b> @objetoLicitaciones.coefSupTotal; (sin redondeo:@objetoLicitaciones.coefsinredondeo)<br />
        <b>coef tip </b> @objetoLicitaciones.coefTipoTotal;<br />
        @* <b>coef tip total</b> @objetoLicitaciones.totalCoefiTipologia;<br /> *@
        @* <b>int total</b> @objetoLicitaciones.totalCoefIntervencion;<br /> *@
        <b>coef int total</b> @objetoLicitaciones.coefIntervencionTotal;<br />
        <b>fases encargadas</b> @objetoLicitaciones.fasesEncargadas;<br />
        <b style="color:orange">horas prod</b> @objetoLicitaciones.horasProduccion;<br />
       @*  <b>horas porcentaje</b> @objetoLicitaciones.horasPorcentaje;<br /> *@
        <b>horas docu</b> @objetoLicitaciones.horasDocumentacion;<br />
        <b>plazo medio</b> @objetoLicitaciones.plazoMedio;<br />
        <b>coef plazos</b> @objetoLicitaciones.coefPlazos;<br />
        <b style="color:darkred" >horas anuales minimas</b> @objetoLicitaciones.horasAnualesMinimas;<br />
        <b>CD</b> @objetoLicitaciones.CD;<br />
        <b>CI</b> @objetoLicitaciones.CI;<br />
        <b>CosteCDCI</b> @objetoLicitaciones.CosteCDCI;<br />
        <b>tasa costes var</b> @objetoLicitaciones.tasaCostesVariables;<br />
        <b>coste hora prod</b> @objetoLicitaciones.costeHoraProduccion;
    </div>
    <div class="pt-5  ">
        <b>Tabla CD+CI para visualizacion de datos, se quitara cuando se vea que los calculos son correctos</b><br />
        <b>IPC Coste Indirecto:</b>@objetoLicitaciones.Variables.IPCCosteIndirecto;<br />
        <Grid TItem="CosteDirectoIndirecto"
        Class="tablaCACOA table"
              Data="objetoLicitaciones.Enumerados.ListaCDCI"
        AllowFiltering="false"
        PageSize="10"
        Height="100"
        EmptyText="No hay registros."
        PageSizeSelectorVisible="false"
        Responsive="true">
            <GridColumns>
                <GridColumn TItem="CosteDirectoIndirecto" HeaderTextAlignment="Alignment.Center" Class="text-end" HeaderText="Nº Trabajadores">
                    <span>@context.NumeroTrabajadores</span>
                </GridColumn>
                <GridColumn TItem="CosteDirectoIndirecto" HeaderTextAlignment="Alignment.Center" Class="text-end" HeaderText="Horas Producción Anuales">
                    <span>@context.HorasProduccionAnuales</span>
                </GridColumn>
                <GridColumn TItem="CosteDirectoIndirecto" HeaderTextAlignment="Alignment.Center" Class="text-end" HeaderText="Coste Min Personal">
                    <span>@context.CosteMinimoPersonal</span>
                </GridColumn>

                <GridColumn TItem="CosteDirectoIndirecto" HeaderTextAlignment="Alignment.Center" Class="text-end" HeaderText="Coste Max Personal">
                    <span>@context.CosteMaximoPersonal</span>
                </GridColumn>
                <GridColumn TItem="CosteDirectoIndirecto" HeaderTextAlignment="Alignment.Center" Class="text-end" HeaderText="Coste Directo Medio">
                    <span>@context.CosteMedioPersonal</span>
                </GridColumn>
                <GridColumn TItem="CosteDirectoIndirecto" HeaderTextAlignment="Alignment.Center" Class="text-end" HeaderText="Costes Directos">
                    <span>@context.CostesDirectos</span>
                </GridColumn>
                <GridColumn TItem="CosteDirectoIndirecto" HeaderTextAlignment="Alignment.Center" Class="text-end" HeaderText="Costes Indirectos">
                    <span>@context.CostesIndirectos</span>
                </GridColumn>
                <GridColumn TItem="CosteDirectoIndirecto" HeaderTextAlignment="Alignment.Center" Class="text-end" HeaderText="Costes Variables">
                    <span>@context.CostesVariables</span>
                </GridColumn>
                <GridColumn TItem="CosteDirectoIndirecto" HeaderTextAlignment="Alignment.Center" Class="text-end" HeaderText="Total Costes">
                    <span>@context.TotalDespachoProfesional</span>
                </GridColumn>
            </GridColumns>
        </Grid>
    </div>
</div>


@code {
    [Parameter]
    public string? idSimulador { get; set; } = "";
    public bool actualizado = true;

    public string TextoSuperior = "Nueva Licitación de Edificación";
    public string TituloBoton = "Guardar";
    private Modal popupGuardar = default!;

    List<ToastMessage> mensajes = new List<ToastMessage>();
    public tsHerramientasCACOA bd;

    private string nombreOriginal = "";

    private bdHerramientaCACOA.LICITACIONES objetoLicitaciones;

    private string pdfUrl;

    private int idUser = 0;

    public bool modificarTabla = true;
    public bool modificarHoras = false;

    public Licitaciones()
    {
    }

    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
                {
                    objetoLicitaciones = new bdHerramientaCACOA.LICITACIONES();
                    objetoLicitaciones.Inicializar(bd);
                }
                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 LicitacionesJson = System.Text.Encoding.UTF8.GetString(byteFichero);

                objetoLicitaciones = System.Text.Json.JsonSerializer.Deserialize<LICITACIONES>(LicitacionesJson);

                if ((simu.FechaModificacion != null && simu.FechaModificacion < fechaActVar) || (simu.FechaModificacion == null && simu.FechaCreacion < fechaActVar))
                {
                    actualizado = false;
                }

                TextoSuperior = "Modificando Licitación \"" + simu.Descripcion + "\"";
                TituloBoton = "Modificar";

                nombreOriginal = objetoLicitaciones.Descripcion;

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

        // para evitar loops
        var settings = new Newtonsoft.Json.JsonSerializerSettings
            {
                ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore
            };

        string jsonObjeto = Newtonsoft.Json.JsonConvert.SerializeObject(objetoLicitaciones, settings);
        int idtipoSimulacion = bd.enumeraciones.First(x => x.Codigo == HerramientaCASA.UtilidadesCASA.obtenerTipoSimulacion(HerramientaCASA.UtilidadesCASA.TiposSimulaciones.LICITACIONCASA)).idEnumeracion;

        if (string.IsNullOrEmpty(idSimulador))
        {

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

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

        HerramientaCASA.UtilidadesCASA.guardarEstadisticas(bd, HerramientaCASA.UtilidadesCASA.TiposSimulaciones.LICITACIONCASA, jsonObjeto, int.Parse(idSimulador));
    }

    private void crearLicitacion(string jsonObjeto)
    {
        int idLicitacionCreada = UtilidadesCASA.crearObjeto(bd, HerramientaCASA.UtilidadesCASA.TiposSimulaciones.LICITACIONCASA, jsonObjeto, objetoLicitaciones.Descripcion, "licitaciones.json", idUser);

        string link = "/LicitacionCASA?idSimulador=" + tsUtilidades.crypt.FEncS(idLicitacionCreada.ToString(), "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890.:/-*", "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890.:/-*", 875421649);

        mensajes.Add(new ToastMessage
            {
                Type = ToastType.Primary,
                Message = $"Licitación creada correctamente.",
            });
        Navigation.NavigateTo(link, true);
    }
    private void actualizarLicitacion(string jsonObjeto)
    {
        UtilidadesCASA.actualziarObjeto(bd, jsonObjeto, objetoLicitaciones.Descripcion, idSimulador);
        cerrarPopupGuardar();
        mensajes.Add(new ToastMessage
            {
                Type = ToastType.Primary,
                Message = $"Licitación actualizada correctamente.",
            });
    }

    private void clonarLicitacion()
    {
        objetoLicitaciones.Inicializar(bd);
        objetoLicitaciones.CalcularHorasSuperficie();
        objetoLicitaciones.CalcularCostesProduccion();
        objetoLicitaciones.Descripcion = objetoLicitaciones.Descripcion + " (Act:" + DateTime.Now + ")";
        string jsonObjeto = Newtonsoft.Json.JsonConvert.SerializeObject(objetoLicitaciones);
        var id = UtilidadesCASA.crearObjeto(bd, HerramientaCASA.UtilidadesCASA.TiposSimulaciones.LICITACIONCASA, jsonObjeto, objetoLicitaciones.Descripcion, "licitaciones.json", idUser);

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

        Navigation.NavigateTo(link, true);
    }

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

    private async Task CalcularTabla(string idProvincia)
    {

        objetoLicitaciones.idProvincia = idProvincia;
        objetoLicitaciones.Enumerados.ListaCDCI= objetoLicitaciones.CalcularTabla(idProvincia);
        objetoLicitaciones.CalcularHorasSuperficie();
        RefreshState();
    }
    private async Task abrirPopupGuardar()
    {
        await popupGuardar.ShowAsync();
    }
    private async Task cerrarPopupGuardar()
    {
        await popupGuardar.HideAsync();
    }
    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", "LicitacionesCASAImprimir");
        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'>
            <link rel='stylesheet' href='https://cdn.jsdelivr.net/npm/bootstrap-icons@1.11.3/font/bootstrap-icons.min.css'>
        </head>
        <body>
    {contenidoHtml}
        </body>
    </html>";

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

        var browser = await Puppeteer.LaunchAsync(new LaunchOptions
        {
            ExecutablePath = revisionInfo.GetExecutablePath(),
            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 = "18mm",
                Bottom = "0mm"
            },
            DisplayHeaderFooter = true,
            HeaderTemplate = @"
                <style>
                    html {
                      -webkit-print-color-adjust: exact;
                    }
                    #header, #footer { padding: 0 !important; }
                </style>
                 <div style='height:55px; 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));
    }



    private async void modificarTablaChanged(bool res)
    {
        //     objetoCASA.TrabajoProfesional.HorasTPE = 0;
        //     objetoCASA.TrabajoProfesional.HorasTPEDocumentacion = 0;
        //     objetoCASA.TrabajoProfesional.HorasTPEDireccion = 0;

        //     if (objetoCASA.TrabajoProfesional.Usos.ToList().Count() != 0)
        //     {
        //         objetoCASA.CalcularHorasTPE();
        //     }

        modificarTabla = res;
        modificarHoras = !res;
        objetoLicitaciones.EsPorUsos = true;
        objetoLicitaciones.horasProduccion = 0;
        objetoLicitaciones.CalcularHorasSuperficie();
        objetoLicitaciones.PrecioDelEncargo = objetoLicitaciones.OtrosTrabajos.Sum(x => x.Coste) + objetoLicitaciones.PrecioTrabProf;
        await InvokeAsync(StateHasChanged);
    }
    private async void modificarHorasChanged(bool res)
    {
        //  horasTPEOriginal = objetoCASA.TrabajoProfesional.HorasTPE;
        // ultimaHoraDocumentacion = objetoCASA.TrabajoProfesional.HorasTPEDocumentacion;
        // ultimaHoraObra = objetoCASA.TrabajoProfesional.HorasTPEDireccion;

        modificarHoras = res;
        modificarTabla = !res;
        objetoLicitaciones.EsPorUsos = false;
        objetoLicitaciones.CalcularHorasSuperficie();
        objetoLicitaciones.PrecioDelEncargo = objetoLicitaciones.OtrosTrabajos.Sum(x => x.Coste) + objetoLicitaciones.PrecioTrabProf;
        await InvokeAsync(StateHasChanged);
    }

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