@using HerramientaCASA.Model
@using Microsoft.AspNetCore.WebUtilities
@using Microsoft.EntityFrameworkCore
@using System.Text
@using bdHerramientaCACOA.db

@page "/Bajas"
@page "/Bajas/{idSimulador}"

@inject UserState userState
@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="@(() => clonarBaja())" 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="@(() => guardarBaja())" Color="ButtonColor.Primary">@TituloBoton</Button>
    </FooterTemplate>
</Modal>
<Modal @ref="popupConfirmarBorrado" title="" IsVerticallyCentered="true" UseStaticBackdrop="true" CloseOnEscape="false">
    <BodyTemplate>
        <div class="col-12 formatoCampos">
            ¿Estás seguro que desea eliminarlo?
        </div>
    </BodyTemplate>
    <FooterTemplate>
        <Button Color="ButtonColor.Secondary" @onclick="cerrarPopupConfirmarBorrado">Cerrar</Button>
        <Button @onclick="@(() => BorrarItem())" Color="ButtonColor.Danger">Eliminar</Button>
    </FooterTemplate>
</Modal>
<Modal @ref="popupGestionDatos" title="@tituloPopup" IsVerticallyCentered="true" UseStaticBackdrop="true" CloseOnEscape="false">
    <BodyTemplate>
        <div class="row">
            <div class="col-12 formatoCampos pt-2">
                <label class="tituloLbl">Descripción:</label>
                <InputText @bind-Value="itemSeleccionado.Descripcion" class="inputForm"></InputText>
            </div>
            <div class="col-md-6 formatoCampos pt-2">
                <label class="tituloLbl">Nº trabajadores:</label>
                <NumberInput TValue="double" Min="0" @bind-Value="itemSeleccionado.NumTrabajadores" class="inputForm"></NumberInput>
            </div>

            <div class="col-md-6 formatoCampos pt-2">
                <label class="tituloLbl">Horas semanales:</label>
                <NumberInput TValue="double" Min="0" @bind-Value="itemSeleccionado.HorasSemanales" class="inputForm"></NumberInput>
            </div>
        </div>

    </BodyTemplate>
    <FooterTemplate>
        <Button Color="ButtonColor.Secondary" @onclick="cerrarPopupGestionDatos">Cerrar</Button>
        @if (!nuevoElemento)
        {
            <Button @onclick="@(() => GestionarDatos("update"))" Color="ButtonColor.Primary">Modificar</Button>
        }
        else
        {
            <Button @onclick="@(() => GestionarDatos("create"))" Color="ButtonColor.Primary">Añadir</Button>
        }
    </FooterTemplate>
</Modal>

<div class="container-fluid">
    <div class="d-flex mb-2 mt-2" 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="objetoBaja.Descripcion" class="form-control inputForm formatoMoneda inputTabla " style="text-align:left;font-weight:bold;"></InputText>
        <button 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 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 class="col-md-6 mt-3 mb-2">
        <div><b>Convenio Colectivo:</b></div>
        <InputSelect @bind-Value="@objetoBaja.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 class="d-flex justify-content-between mt-3">
        <div><b>Datos del Despacho Profesional</b></div>
    </div>
    <div>
        <div class="row">
            <div class="col-md-6">
                <div>
                    <table class="table tablaCACOA tablaCACOA2 mb-0">
                        <tr>
                            <td class="colorFilasIntro fw-bold w4">Año oferta:</td>
                            <td class="text-end">
                                <NumberInput @bind-Value="objetoBaja.AnyoOferta" class="inputForm derecha inputTabla"></NumberInput>
                            </td>
                        </tr>
                        <tr>
                            <td class="colorFilasIntro fw-bold w4">Oferta económica:</td>
                            <td class="text-end">
                                <div class="d-flex" style="gap:3px;">
                                    <CurrencyInput HideCurrencySymbol="true" TValue="double" Locale="es-ES" Min="0" @bind-Value="objetoBaja.OfertaEconomica" class="inputForm derecha inputTabla formatoMoneda"></CurrencyInput> €
                                </div>
                            </td>
                        </tr>
                        <tr>
                            <td class="colorFilasIntro fw-bold w4">Tasa producción:</td>
                            <td class="text-end">
                                <div class="d-flex" style="gap:3px;">
                                    <NumberInput TValue="double" Min="0" @bind-Value="objetoBaja.TasaProduccion" class="inputForm derecha inputTabla"></NumberInput> %
                                </div>
                            </td>
                        </tr>

                    </table>
                </div>
            </div>
            <div class="col-md-6"></div>
            <div class="col-md-6">
                <Grid TItem="DatosGrupoTrabajo"
                Class="tablaCACOA table"
                Data="listadoGrupos"
                AllowFiltering="false"
                EmptyText="No hay registros."
                Height="100"
                PageSizeSelectorVisible="false"
                Responsive="true">
                    <GridColumns>
                        <GridColumn TItem="DatosGrupoTrabajo" HeaderTextAlignment="Alignment.Center" HeaderText="Descripción" Class="colorFilasIntro w4">
                            <span>@context.Descripcion</span>
                        </GridColumn>

                        <GridColumn TItem="DatosGrupoTrabajo" HeaderTextAlignment="Alignment.Center" HeaderText="Nº Trabajadores">

                            <InputNumber TValue="double" Locale="es-ES" Min="0" class="inputForm formatoMoneda derecha inputTabla" Value="@context.NumTrabajadores" ValueExpression="() => context.NumTrabajadores" ValueChanged="(value) => NumTrabCambiado(value,context)"></InputNumber>
                        </GridColumn>

                        <GridColumn TItem="DatosGrupoTrabajo" HeaderTextAlignment="Alignment.Center" HeaderText="Horas Semanales">
                            <div class="d-flex" style="gap:3px;">
                                <InputNumber TValue="double" Locale="es-ES" Min="0" class="inputForm  derecha inputTabla" Value="@context.HorasSemanales" ValueExpression="() => context.HorasSemanales" ValueChanged="(value) => HorasSemanalesCambiado(value,context)"></InputNumber> h
                                </div>
                        </GridColumn>
                    </GridColumns>
                </Grid>
            </div>

        </div>
        <div class="row">
            <div class="col-md-6">
                <table class="table tablaCACOA tablaCACOA2 mb-0">
                    <tr>
                        <td class="colorB fw-bold w4">Total Costes Personal (€)</td>
                        <td class="text-end"><span>@objetoBaja.TotalCostesPersonales €</span></td>
                    </tr>

                    <tr>
                        <td class="colorB fw-bold">Horas Despacho</td>
                        <td class="text-end">
                            <span>
                                @objetoBaja.HorasDespacho h
                                </span>
                        </td>
                    </tr>
                    <tr>
                        <td class="colorB fw-bold">Tasa de Producción</td>
                        <td class="text-end">
                            <span>@objetoBaja.TasaProduccion %</span></td>
                    </tr>
                    <tr>
                        <td class="colorB fw-bold"> Coste Directo Hora Producción</td>
                        <td class="text-end"><span>@objetoBaja.CosteDirectoHP €</span></td>
                    </tr>
                    <tr>
                        <td class="colorB fw-bold"> Costes Indirectos</td>
                        <td class="text-end"><span>@objetoBaja.CosteIndirecto €</span></td>
                    </tr>
                    <tr>
                        <td class="colorB fw-bold"> Costes Variables</td>
                        <td class="text-end"><span>@objetoBaja.CosteVariable €</span></td>
                    </tr>
                    <tr>
                        <td class="colorB fw-bold"> Total Coste Hora Producción</td>
                        <td class="text-end"><span>@objetoBaja.TotalCosteHP €</span></td>
                    </tr>
                    <tr>
                        <td class="colorB fw-bold"> Tiempo ejecución Trab. Prof. </td>
                        <td class="text-end">
                           <span> @objetoBaja.TiempoEjecucionTrabProf h</span>
                        </td>
                    </tr>
                    <tr>
                        <td class="tdAlter fw-bold"> Semanas Producción </td>
                        <td class="text-end"><span>@objetoBaja.SemanasProduccion</span></td>
                    </tr>
                </table>
            </div>
        </div>
    </div>
</div>


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

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

    public BAJA objetoBaja { get; set; }
    public tsHerramientasCACOA bd;
    List<DatosGrupoTrabajo> listadoGrupos = new List<DatosGrupoTrabajo>();

    private DatosGrupoTrabajo itemSeleccionado { get; set; } = new DatosGrupoTrabajo();

    private string tituloPopup = "";
    private Modal popupGestionDatos = default!;
    private Modal popupConfirmarBorrado = default!;

    private bool nuevoElemento;
    private ValidationMessageStore? messageStore;

    List<ToastMessage> mensajes = new List<ToastMessage>();

    private string nombreOriginal = "";


    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
                {
                    objetoBaja = new BAJA();
                    objetoBaja.Inicializar(bd);
                }
                catch (Exception ex)
                {
                    var a = ex.Message;
                }
            }
            else
            {
                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 BajaJson = System.Text.Encoding.UTF8.GetString(byteFichero);

                objetoBaja = System.Text.Json.JsonSerializer.Deserialize<BAJA>(BajaJson);

                var fechaActVar = bd.enumeraciones.First(x => x.Codigo == "CW.FECHAULTMOD").Fecha1;
                if ((simu.FechaModificacion != null && simu.FechaModificacion < fechaActVar) || (simu.FechaModificacion == null && simu.FechaCreacion < fechaActVar))
                {
                    actualizado = false;
                }
                TextoSuperior = "Modificando simulación \"" + simu.Descripcion + "\"";
                TituloBoton = "Modificar";

                nombreOriginal = objetoBaja.Descripcion;

            }

            listadoGrupos = objetoBaja.ListaDespachoProfesional.ToList();
        }
        catch (Exception ex)
        {
            Console.WriteLine($"Error durante la inicialización: {ex.Message}");
        }
    }



    private async Task abrirPopupGestionDatos(DatosGrupoTrabajo objeto, bool esNuevo)
    {
        itemSeleccionado = objeto;

        if (esNuevo)
        {
            nuevoElemento = true;
        }
        else
        {
            nuevoElemento = false;
        }

        if (!nuevoElemento)
        {
            tituloPopup = "Modificar uso";
        }
        else
        {
            tituloPopup = "Nuevo uso";
        }
        await popupGestionDatos.ShowAsync();
    }
    private async Task cerrarPopupGestionDatos()
    {
        await popupGestionDatos.HideAsync();
    }


    private async Task GestionarDatos(string accion)
    {
        switch (accion)
        {
            case "update":
                objetoBaja.ActualizarDatosGrupoTrabajo(itemSeleccionado);
                await cerrarPopupGestionDatos();

                mensajes.Add(new ToastMessage
                    {
                        Type = ToastType.Primary,
                        Message = $"Actualizado correctamente.",
                    });

                break;

            case "create":
                objetoBaja.ListaDespachoProfesional.Add(itemSeleccionado);

                await cerrarPopupGestionDatos();
                mensajes.Add(new ToastMessage
                    {
                        Type = ToastType.Primary,
                        Message = $"Guardado correctamente.",
                    });
                break;

            case "delete":
                objetoBaja.ListaDespachoProfesional.Remove(itemSeleccionado);
                await cerrarPopupConfirmarBorrado();
                mensajes.Add(new ToastMessage
                    {
                        Type = ToastType.Primary,
                        Message = $"Eliminado correctamente.",
                    });
                break;
        }
        listadoGrupos = objetoBaja.ListaDespachoProfesional.ToList();
        await InvokeAsync(StateHasChanged);
    }

    //////// PopUp eliminar registro
    private async Task abrirPopupConfirmarBorrado(DatosGrupoTrabajo objeto)
    {
        itemSeleccionado = objeto;
        await popupConfirmarBorrado.ShowAsync();
    }
    private async Task cerrarPopupConfirmarBorrado()
    {
        await popupConfirmarBorrado.HideAsync();
    }
    private async Task BorrarItem()
    {
        await GestionarDatos("delete");
    }

    private async void NumTrabCambiado(double e, DatosGrupoTrabajo objeto)
    {
        objeto.NumTrabajadores = (double)e;
        objetoBaja.ActualizarDatosGrupoTrabajo(objeto);

        await InvokeAsync(StateHasChanged);
    }
    private async void HorasSemanalesCambiado(double e, DatosGrupoTrabajo objeto)
    {
        objeto.HorasSemanales = (double)e;
        objetoBaja.ActualizarDatosGrupoTrabajo(objeto);

        await InvokeAsync(StateHasChanged);
    }


    private void guardarBaja()
    {
        string jsonObjeto = Newtonsoft.Json.JsonConvert.SerializeObject(objetoBaja);
        int idtipoSimulacion = bd.enumeraciones.First(x => x.Codigo == HerramientaCASA.UtilidadesCASA.obtenerTipoSimulacion(HerramientaCASA.UtilidadesCASA.TiposSimulaciones.BAJA)).idEnumeracion;


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

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

    private void crearBaja(string jsonObjeto)
    {
        int idBajaCreada= UtilidadesCASA.crearObjeto(bd, HerramientaCASA.UtilidadesCASA.TiposSimulaciones.BAJA, jsonObjeto, objetoBaja.Descripcion, "baja.json", userState.idUser);
        string link = "/Bajas?idSimulador=" + tsUtilidades.crypt.FEncS(idBajaCreada.ToString(), "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890.:/-*", "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890.:/-*", 875421649);

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

    private void clonarBaja()
    {
        objetoBaja.Inicializar(bd);
        objetoBaja.CalcularBaja();
        objetoBaja.Descripcion = objetoBaja.Descripcion + " (Act:" + DateTime.Now + ")";
        string jsonObjeto = Newtonsoft.Json.JsonConvert.SerializeObject(objetoBaja);
        var id = UtilidadesCASA.crearObjeto(bd, HerramientaCASA.UtilidadesCASA.TiposSimulaciones.CASA, jsonObjeto, objetoBaja.Descripcion, "baja.json", userState.idUser);

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

        Navigation.NavigateTo(link, true);
    }
    public void RefreshState()
    {
        this.StateHasChanged();
    }
    private async Task CalcularTabla(string idProvincia)
    {

        objetoBaja.idProvincia = idProvincia;
        objetoBaja.ListaCDCI = objetoBaja.CalcularTabla(idProvincia);
        objetoBaja.CalcularBaja();
        RefreshState();
    }
    private async Task abrirPopupGuardar()
    {
        await popupGuardar.ShowAsync();
    }
    private async Task cerrarPopupGuardar()
    {
        await popupGuardar.HideAsync();
    }
}


