
@page "/LicitacionesUrban"
@rendermode InteractiveServer
@using HerramientaCASA.Components.Pages.LicitacionUrban
@using HerramientaCASA.Model
@using Microsoft.AspNetCore.WebUtilities
@using System.Globalization
@using bdHerramientaCACOA.HerramientaURBAN
@using bdHerramientaCACOA.db
@using Microsoft.AspNetCore.Components.Server.ProtectedBrowserStorage
@inject ProtectedSessionStorage ProtectedSessionStore
@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 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-2"></i>@TituloBoton</button>
        <b class="Fuente2 ps-2 pe-2 nomSim">Nombre de la licitación: </b>
        <InputText @bind-Value="objetoLicitacionUrban.NombreSimulacion" class="form-control inputForm formatoMoneda inputTabla " style="text-align:left;font-weight:bold;"></InputText>
    </div>
<div class="row">
    <div class="col-md-6 mt-3 mb-2">
        <div><b>Convenio Colectivo:</b></div>
        <InputSelect @bind-Value="@objetoLicitacionUrban.idProvincia" class="inputForm" @oninput="e => CalcularTabla(e.Value.ToString())">
            <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>
 
   
    <div class="row p-0 m-0">
        <div class="col-md-12 mt-3 mb-3">
            <CascadingValue Value="this">
                <DocumentosLicitacion objetoLicitacionUrban="objetoLicitacionUrban"></DocumentosLicitacion>
            </CascadingValue>
        </div>
    </div>

    <div class="row p-0 m-0">
        <div class="col-md-3">
            <CascadingValue Value="this">
                <FasesLicitacionesUrban objetoLicitacionUrban="objetoLicitacionUrban"></FasesLicitacionesUrban>
            </CascadingValue>
        </div>

        <div class="col-md-5">
               
            <CascadingValue Value="this">
                <TablaTrabajadoresUrban objetoLicitacionUrban="objetoLicitacionUrban"></TablaTrabajadoresUrban>
            </CascadingValue>

         @*    <CascadingValue Value="this">
                <InstrumentosLicitacionesUrban objetoLicitacionUrban="objetoLicitacionUrban"></InstrumentosLicitacionesUrban>
            </CascadingValue> *@
        </div>
        <div class="col-md-4">
            <div class="mt-3 mb-3"><b>Costes Asociados a los Servicios de Arquitectura</b></div>

            <table class="table tablaCACOA tablaCACOA2 mb-0">
                <thead>
                    <tr>
                        <th class="colorB fw-bold">Concepto</th>
                        <th class="colorB fw-bold text-end"></th>
                    </tr>
                </thead>
                <tbody>
                    <tr>
                        <td class="colorFilasIntro fw-bold w4">Plazo de presentación de la documentación:</td>
                        <td class="text-end columna40Ancho">
                            <div class="d-flex" style="gap:3px;">
                                @* <InputNumber TValue="int" Locale="es-ES" Min="0" class="inputForm formatoMoneda inputTabla" Value="@objetoLicitacionUrban.PlazoPresentacionDocumentos" ValueExpression="() => objetoLicitacionUrban.PlazoPresentacionDocumentos" ValueChanged="(value) => PlazoPresentacionDocumentosCambiado(value)"></InputNumber> meses *@
                                <InputNumber TValue="double" @bind-Value="objetoLicitacionUrban.PlazoPresentacionDocumentos"
                                             step="any"
                                             @oninput="e =>  controlarMeses(e.Value?.ToString())"
                                             class="inputForm formatoMoneda inputTabla text-end" /> meses
                            </div>
                        </td>
                    </tr>
                    <tr>
                        <td class="colorB fw-bold w4">Coste hora de producción</td>
                        <td class="text-end columna40Ancho"><span> @objetoLicitacionUrban.CosteHP.MilesYDecimales() €/hora</span></td>
                    </tr>
                    <tr>
                        <td class="colorB fw-bold w4">Coste de producción del Trabajo Profesional</td>
                        <td class="text-end columna40Ancho"><span> @objetoLicitacionUrban.CostesProduccionTrabProf.MilesYDecimales() €</span></td>
                    </tr>

                    <tr>
                        <td class="colorB fw-bold w4">
                            G.G. + B.I. <br />
                            <span class="fw-normal" style="font-size:10px;">(40/19 Junta Consultiva de Contratación Pública del Estado)</span>
                        </td>
                        <td class="text-end columna40Ancho" style="align-content:center;">
                            <div class="d-flex" style="justify-content: end; gap:3px;">
                                @objetoLicitacionUrban.Beneficio %
                            </div>
                        </td>
                    </tr>
                </tbody>
                <tfoot>
                    <tr>
                        <td colspan="2" class="text-end fw-bold" style="background: #ffc107;">
                            COSTES DE PRODUCCIÓN DEL TRABAJO PROFESIONAL: <span>@objetoLicitacionUrban.PrecioDelTrabajo.MilesYDecimales() €</span>
                        </td>
                    </tr>
                </tfoot>
            </table>

        </div>

        <div class="pt-5" style="margin-top:2000px;">
            <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>@objetoLicitacionUrban.Variables.IPCCosteIndirecto;<br />
            <Grid TItem="CosteDirectoIndirecto"
            Class="tablaCACOA table"
            Data="objetoLicitacionUrban.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>
</div>


@code {
    [Parameter]
    public string? idSimulador { get; set; } = "";
    public string TextoSuperior = "Nueva licitación de Urbanismo";
    public string TituloBoton = "Guardar";
    private Modal popupGuardar = default!;
    public bool actualizado = true;

    public tsHerramientasCACOA bd;
    private bdHerramientaCACOA.LicitacionesURBAN objetoLicitacionUrban;
    List<ToastMessage> mensajes = new List<ToastMessage>();

    private string nombreOriginal = "";

    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
                {

                    objetoLicitacionUrban = new bdHerramientaCACOA.LicitacionesURBAN();
                    objetoLicitacionUrban.RellenarCamposExtra(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 CASAJson = System.Text.Encoding.UTF8.GetString(byteFichero);

                objetoLicitacionUrban = System.Text.Json.JsonSerializer.Deserialize<bdHerramientaCACOA.LicitacionesURBAN>(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 = objetoLicitacionUrban.NombreSimulacion;

            }

            var obtenerID = await ProtectedSessionStore.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

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

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

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

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

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

    private void clonarUrban()
    {
        objetoLicitacionUrban.RellenarCamposExtra(bd);

        objetoLicitacionUrban.NombreSimulacion = objetoLicitacionUrban.NombreSimulacion + " (Act:" + DateTime.Now + ")";
        string jsonObjeto = Newtonsoft.Json.JsonConvert.SerializeObject(objetoLicitacionUrban);
        var id = UtilidadesCASA.crearObjeto(bd, HerramientaCASA.UtilidadesCASA.TiposSimulaciones.URBANDSIMP, jsonObjeto, objetoLicitacionUrban.NombreSimulacion, "licitacionesUrban.json", idUser);

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

        Navigation.NavigateTo(link, true);
    }

    public async Task CalcularTabla(string idProvincia)
    {
        objetoLicitacionUrban.idProvincia = idProvincia;
        objetoLicitacionUrban.Enumerados.ListaCDCI = objetoLicitacionUrban.CalcularTabla(idProvincia);
        objetoLicitacionUrban.CalcularLicitacion();
        RefreshState();
    }

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

 
    private async void PlazoPresentacionDocumentosCambiado(double e)
    {
        objetoLicitacionUrban.PlazoPresentacionDocumentos = e;

        objetoLicitacionUrban.CalcularLicitacion();

        await InvokeAsync(StateHasChanged);
    }

    private void controlarMeses(string meses)
    {

        if (double.TryParse(meses, out var valor))
        {
            string parseado = meses.ToString().Replace(",", ".");
            objetoLicitacionUrban.PlazoPresentacionDocumentos = double.Parse(parseado, CultureInfo.InvariantCulture);
        }

        PlazoPresentacionDocumentosCambiado(objetoLicitacionUrban.PlazoPresentacionDocumentos);
    }

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

