@page "/ConvenioColectivo"
@inject NavigationManager Navigation
@layout ConfiguracionLayout
@using BlazorBootstrap
@using System.Globalization
@using bdHerramientaCACOA.db

<Toasts class="p-3 font-weight-bold" Style="color:white;" AutoHide="true" Delay="4000" Messages="mensajes" Placement="ToastsPlacement.BottomCenter" />
<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>
<EditForm EditContext="@editContext" OnValidSubmit="guardarFormulario" OnInvalidSubmit="@MostrarErrores" FormName="factoCompleForm">
    <DataAnnotationsValidator></DataAnnotationsValidator>
    <Modal @ref="popupGestionDatos" title="@tituloPopup" IsVerticallyCentered="true" UseStaticBackdrop="true" CloseOnEscape="false">
        <BodyTemplate>
            <div class="row">

                @if (nuevoElemento)
                {
                    <div class="row">
                        <div class="col-12 formatoCampos pt-2">
                            <label class="tituloLbl">Rendimiento:</label>
                            <InputSelect @bind-Value="@idProviItem" class="inputForm">
                                @foreach (var provi in listadoProvincias)
                                {
                                    <option value="@provi.CodigoProvincia">@provi.Nombre</option>
                                }
                            </InputSelect>
                        </div>
                    </div>
                }

                <div class="col-12 formatoCampos pt-2">
                    <label class="tituloLbl">Titulado Superior:</label>
                    <NumberInput Min="0" TValue="double" @bind-Value="itemSeleccionado.valorGradoSup" @oninput="e => ValidarYActualizar(e, nameof(itemSeleccionado.valorGradoSup))" class="inputForm"></NumberInput>
                </div>
                <div class="col-12 formatoCampos pt-2">
                    <label class="tituloLbl">Titulado Medio:</label>
                    <NumberInput Min="0" TValue="double" @bind-Value="itemSeleccionado.valorGradoMed" @oninput="e => ValidarYActualizar(e, nameof(itemSeleccionado.valorGradoMed))" class="inputForm"></NumberInput>
                </div>
                <div class="col-12 formatoCampos pt-2">
                    <label class="tituloLbl">Delineante / BIM:</label>
                    <NumberInput Min="0" TValue="double" @bind-Value="itemSeleccionado.valorDelinPro" @oninput="e => ValidarYActualizar(e, nameof(itemSeleccionado.idDelinPro))" class="inputForm"></NumberInput>
                </div>
                <div class="col-12 formatoCampos pt-2">
                    <label class="tituloLbl">Administrativo:</label>
                    <NumberInput Min="0" TValue="double" @bind-Value="itemSeleccionado.valorAdmin" @oninput="e => ValidarYActualizar(e, nameof(itemSeleccionado.idAdmin))" class="inputForm"></NumberInput>
                </div>
                <!--<div class="validation-message">@GetExternalValidationMessage(nameof(itemSeleccionado.CosteAnualTrabajador))</div>-->
            </div>
        </BodyTemplate>
        <FooterTemplate>
            <Button Color="ButtonColor.Secondary" @onclick="cerrarPopupGestionDatos">Cerrar</Button>
            <Button Type="ButtonType.Submit" Color="ButtonColor.Primary">@(nuevoElemento ? "Añadir" : "Modificar")</Button>
        </FooterTemplate>
    </Modal>
</EditForm>

<div class="container-fluid mt-3">
    <div class="row" style="justify-content:space-between">
        <div class="form-group mt-4 col-6">
            <input class="form-control" type="text" style="width: 400px;" placeholder="Filtrar..."
                   @bind-value="Filter" @bind-value:after="AplicarFiltros" />
        </div>

        <div class="d-flex justify-content-end mt-3 col-2">
            <button @onclick="@(() => abrirPopupGestionDatos(new ConvenioProvincia(), true))" class="btnBlue d-flex align-items-center"> <i class="fas fa-plus-square pe-1"></i> Nuevo convenio colectivo</button>
        </div>
    </div>

    <Grid TItem="ConvenioProvincia"
          Class="tablaCACOA table"
          Data="listadoConProv"
          AllowFiltering="false"
          PageSize="10"
          FixedHeader="true"
          Height="800"
          Unit="Unit.Px"
          EmptyText="No hay registros."
          PageSizeSelectorVisible="false"
          Responsive="true">
        <GridColumns>
            <GridColumn TItem="ConvenioProvincia" HeaderTextAlignment="Alignment.Center"  HeaderText="Convenio">
                <span>@context.NombreProvincia</span>
            </GridColumn>
            <GridColumn TItem="ConvenioProvincia" HeaderTextAlignment="Alignment.Center" Class="columna20Ancho text-end" HeaderText="Titulado Superior">
                <span>@context.valorGradoSup.MilesYDecimales() €</span>
            </GridColumn>

            <GridColumn TItem="ConvenioProvincia" HeaderTextAlignment="Alignment.Center" Class="columna20Ancho text-end" HeaderText="Titulado Medio">
                <span>@context.valorGradoMed.MilesYDecimales() €</span>
            </GridColumn>
            <GridColumn TItem="ConvenioProvincia" HeaderTextAlignment="Alignment.Center" Class="columna20Ancho text-end" HeaderText="Delineante/BIM">
                <span>@context.valorDelinPro.MilesYDecimales() €</span>
            </GridColumn>

            <GridColumn TItem="ConvenioProvincia" HeaderTextAlignment="Alignment.Center" Class="columna20Ancho text-end"  HeaderText="Administrativo">
                <span>@context.valorAdmin.MilesYDecimales() €</span>
            </GridColumn>

            <GridColumn TItem="ConvenioProvincia" Class="botonesTabla" HeaderText="">
               <div class="btnTablasEspaciado">
                    <span @onclick="@(() => abrirPopupGestionDatos(@context,false))" class="btnBorrarGuardar">
					<Icon CustomIconName="fas fa-edit"></Icon>
				</span>
                
                <span @onclick="@(() => abrirPopupConfirmarBorrado(@context))" style="cursor: pointer;">
                <Icon CustomIconName="fas fa-trash"></Icon>
                </span>
                </div>
            </GridColumn>
        </GridColumns>
    </Grid>
</div>

@code {

    public List<ConvenioProvincia> listadoConProv = new List<ConvenioProvincia>();
    public List<ConvenioProvincia> listadoCCAux = new List<ConvenioProvincia>();

    public List<bdHerramientaCACOA.db.provincias> listadoProvincias = new List<bdHerramientaCACOA.db.provincias>();

    [SupplyParameterFromForm]
    private ConvenioProvincia itemSeleccionado { get; set; } = new ConvenioProvincia();

    public string Filter { get; set; } = "";
    private string tituloPopup = "";
    private Modal popupGestionDatos = default!;
    private Modal popupConfirmarBorrado = default!;

    private string idProviItem = "";

    private bool nuevoElemento;

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

    private EditContext? editContext;
    private ValidationMessageStore? messageStore;
    public tsHerramientasCACOA bd;
    private string tipoFactorComplejidad = "FACCOMP.";

    protected override async Task OnInitializedAsync()
    {
        try
        {
            bd = tsHerramientasCACOA.NuevoContexto(SoloLectura: false);

            editContext = new EditContext(itemSeleccionado);
            messageStore = new ValidationMessageStore(editContext);
            obtenerListaConvenioProvincia();
        }
        catch (Exception ex)
        {
            var a = ex.Message;

        }
    }
    private void obtenerListaConvenioProvincia()
    {
        listadoConProv = new List<ConvenioProvincia>();

        var listadoCC = bd.conveniocolectivo.OrderBy(x => x.idProvincia).ToList();
        var listadoCP = listadoCC.GroupBy(x => x.idProvincia).ToList();
        for (int i = 0; i < listadoCP.Count; i++)
        {
            List<conveniocolectivo> cpg = listadoCP[i].ToList();

            ConvenioProvincia cp = new ConvenioProvincia();
            cp.id = i;

            cp.idProvincia = cpg.First().idProvincia;
            if (cp.idProvincia != null)
            {
                cp.NombreProvincia = cpg.First().idProvinciaNavigation.Nombre;
            }
            var gradoSup = cpg.First(x => x.idEnumeracionNavigation.Codigo == "PUESTOTRABAJO.TECGRADSUP");
            var gradoMed = cpg.First(x => x.idEnumeracionNavigation.Codigo == "PUESTOTRABAJO.GESTPROY");
            var delin = cpg.First(x => x.idEnumeracionNavigation.Codigo == "PUESTOTRABAJO.DELINPROY");
            var admin = cpg.First(x => x.idEnumeracionNavigation.Codigo == "PUESTOTRABAJO.ADMIN");
            cp.idGradoSup = gradoSup.idConvenioColectivo;
            cp.valorGradoSup = gradoSup.CosteAnualTrabajador;
            cp.idGradoMedio = gradoMed.idConvenioColectivo;
            cp.valorGradoMed = gradoMed.CosteAnualTrabajador;
            cp.idDelinPro = delin.idConvenioColectivo;
            cp.valorDelinPro = delin.CosteAnualTrabajador;
            cp.idAdmin = admin.idConvenioColectivo;
            cp.valorAdmin = admin.CosteAnualTrabajador;

            listadoConProv.Add(cp);
        }

        listadoCCAux = listadoConProv.ToList();
    }
    private void AplicarFiltros()
    {
        // Filtra la lista en función de los criterios ingresados
        listadoConProv = new List<ConvenioProvincia>();
        foreach (ConvenioProvincia item in listadoCCAux)
        {
            if (IsVisible(item) == true)
            {
                listadoConProv.Add(item);
            }
        }
    }

    public bool IsVisible(ConvenioProvincia listado)
    {
        if (string.IsNullOrEmpty(Filter))
        {
            return true;
        }

        if (listado.NombreProvincia != null && listado.NombreProvincia.Contains(Filter.ToLower(), StringComparison.OrdinalIgnoreCase))
        {
            return true;
        }

        return false;
    }

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

        if (esNuevo)
        {
            var idsProvi = listadoConProv.Select(y => y.idProvincia).ToList();

            listadoProvincias = bd.provincias
                .Where(x => !idsProvi.Contains(x.CodigoProvincia))
                .ToList();

            idProviItem = listadoProvincias.First().CodigoProvincia;
            nuevoElemento = true;
        }
        else
        {
            nuevoElemento = false;
        }

        if (!nuevoElemento)
        {
            tituloPopup = "Modificar Convenio Colectivo: " + itemSeleccionado.NombreProvincia;
        }
        else
        {
            tituloPopup = "Nuevo Convenio Colectivo";
        }

        await popupGestionDatos.ShowAsync();
    }
    private async Task cerrarPopupGestionDatos()
    {
        await popupGestionDatos.HideAsync();
    }

    private void ValidarYActualizar(ChangeEventArgs e, string fieldName)
    {
        var value = e.Value?.ToString();
        var field = new FieldIdentifier(itemSeleccionado, fieldName);

        switch (fieldName)
        {
            case nameof(itemSeleccionado.valorGradoSup):

                if (!string.IsNullOrEmpty(value))
                {

                    itemSeleccionado.valorGradoSup = int.Parse(value, CultureInfo.InvariantCulture);
                }
                else
                {

                    itemSeleccionado.valorGradoSup = 0;
                }

                break;
            case nameof(itemSeleccionado.valorGradoMed):

                if (!string.IsNullOrEmpty(value))
                {

                    itemSeleccionado.valorGradoMed = int.Parse(value, CultureInfo.InvariantCulture);
                }
                else
                {

                    itemSeleccionado.valorGradoMed = 0;
                }

                break;
            case nameof(itemSeleccionado.valorDelinPro):

                if (!string.IsNullOrEmpty(value))
                {

                    itemSeleccionado.valorDelinPro = int.Parse(value, CultureInfo.InvariantCulture);
                }
                else
                {

                    itemSeleccionado.valorDelinPro = 0;
                }

                break;
            case nameof(itemSeleccionado.valorAdmin):

                if (!string.IsNullOrEmpty(value))
                {

                    itemSeleccionado.valorAdmin = int.Parse(value, CultureInfo.InvariantCulture);
                }
                else
                {

                    itemSeleccionado.valorAdmin = 0;
                }

                break;

        }

        messageStore?.Clear(field);

        editContext?.NotifyValidationStateChanged();
    }

    private void ValidarTodo()
    {
        ValidarYActualizar(new ChangeEventArgs { Value = itemSeleccionado.valorGradoSup }, nameof(itemSeleccionado.valorGradoSup));
        ValidarYActualizar(new ChangeEventArgs { Value = itemSeleccionado.valorGradoMed }, nameof(itemSeleccionado.valorGradoMed));
        ValidarYActualizar(new ChangeEventArgs { Value = itemSeleccionado.valorDelinPro }, nameof(itemSeleccionado.valorDelinPro));
        ValidarYActualizar(new ChangeEventArgs { Value = itemSeleccionado.valorAdmin }, nameof(itemSeleccionado.valorAdmin));
    }

    private string GetExternalValidationMessage(string fieldName)
    {
        var field = new FieldIdentifier(itemSeleccionado, fieldName);
        return messageStore?[field].FirstOrDefault() ?? string.Empty;
    }

    private async Task GestionarDatos(string accion)
    {

        //var convObtenido = bd.conveniocolectivo.Where(x => x.idConvenioColectivo == itemSeleccionado.idConvenioColectivo).FirstOrDefault();

        switch (accion)
        {
            case "update":
                UtilidadesCASA.actualizarConvenioColectivo(bd, itemSeleccionado);

                await cerrarPopupGestionDatos();

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

                break;

            case "create":
                itemSeleccionado.idProvincia = idProviItem;

                UtilidadesCASA.crearConvenioColectivo(bd, itemSeleccionado);

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

            case "delete":
                UtilidadesCASA.eliminarConvenioColectivo(bd, itemSeleccionado);

                await cerrarPopupConfirmarBorrado();
                mensajes.Add(new ToastMessage
                {
                    Type = ToastType.Primary,
                    Message = $"Eliminado correctamente.",
                });
                break;
        }
        bd.SaveChanges();
        obtenerListaConvenioProvincia();

        await InvokeAsync(StateHasChanged);

    }


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

    // GUARDAR
    private async Task guardarFormulario()
    {
        try
        {
            ValidarTodo();

            if (!editContext!.GetValidationMessages().Any())
            {
                string accion = nuevoElemento ? "create" : "update";
                await GestionarDatos(accion);
            }
            else
            {
                mensajes.Add(new ToastMessage
                    {
                        Type = ToastType.Warning,
                        Message = $"Debe rellenar los campos obligatorios.",
                    });
            }

        }
        catch (Exception)
        {
            mensajes.Add(new ToastMessage
                {
                    Type = ToastType.Danger,
                    Message = $"Error al guardar.",
                });
        }

    }

    private void MostrarErrores()
    {
        
        messageStore?.Clear();
        foreach (var field in new[] { nameof(itemSeleccionado.valorGradoSup), nameof(itemSeleccionado.valorGradoMed), nameof(itemSeleccionado.valorDelinPro), nameof(itemSeleccionado.valorAdmin) })
        {
            ValidarYActualizar(new ChangeEventArgs { Value = typeof(ConvenioProvincia).GetProperty(field)?.GetValue(itemSeleccionado) }, field);
        }
    }

}
