@using BlazorBootstrap
@using System.Text.Json
@using Microsoft.AspNetCore.WebUtilities
@using System.Globalization
@using bdHerramientaCACOA.HerramientaURBAN
@using bdHerramientaCACOA.db
@using static bdHerramientaCACOA.CASA

<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="tiposForm">
    <DataAnnotationsValidator></DataAnnotationsValidator>
    <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 MaxLength="50" @bind-Value="itemSeleccionado.Descripcion" @oninput="e => ValidarYActualizar(e, nameof(itemSeleccionado.Descripcion))" class="inputForm"></InputText>
                </div>
                <div class="validation-message">@GetExternalValidationMessage(nameof(itemSeleccionado.Descripcion))</div>
            </div>
            <div class="row">
                <div class="col-12 formatoCampos pt-2">
                    <label class="tituloLbl">Nº Trabajadores:</label>
                    <div class="d-flex" style="gap:3px;">
                        <InputNumber TValue="int" @bind-Value="itemSeleccionadoTemporal.Cantidad"
                        step="any"
                        @oninput="e => ValidarYActualizar(e, nameof(itemSeleccionadoTemporal.Cantidad))"
                        class="inputForm text-end" />
                    </div>
                </div>
                <div class="validation-message">@GetExternalValidationMessage(nameof(itemSeleccionadoTemporal.Cantidad))</div>
            </div>
            <div class="col-12 formatoCampos pt-2">
                <label class="tituloLbl">Grupo Trabajador:</label>
                <InputSelect @bind-Value="@itemSeleccionadoTemporal.idConvenioColectivo" class="inputForm" @oninput="e => ValidarYActualizar(e, nameof(itemSeleccionadoTemporal.idConvenioColectivo))">
                    @foreach (var grupoTipologia in objetoLicitacionUrban.Enumerados.ListaGrupoTrabajadores)
                    {
                        <option value="@grupoTipologia.idEnumeracion">@grupoTipologia.ValorAlfabetico1</option>
                    }
                </InputSelect>
                <div class="validation-message">@GetExternalValidationMessage(nameof(itemSeleccionadoTemporal.idConvenioColectivo))</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>
    <div style="position:relative;margin-bottom: 45px;">
        <div class="d-flex justify-content-between mt-3" style="padding-bottom:6px;">
            <div><b>Solvencia técnica</b></div>
        </div>
        <Grid TItem="LicitacionesURBAN.SolvenciaTecnica"
        Class="tablaCACOA table"
        Data="listaSolvenciaTecnica"
        AllowFiltering="false"
        PageSize="10"
        Height="100"
        EmptyText="No hay registros."
        PageSizeSelectorVisible="false"
        Responsive="true">

            <GridColumns>
                <GridColumn TItem="LicitacionesURBAN.SolvenciaTecnica" Class="columna40Ancho" HeaderTextAlignment="Alignment.Center" HeaderText="Trabajadores" PropertyName="Documentacion">
                    @context.Descripcion
                </GridColumn>
                <GridColumn TItem="LicitacionesURBAN.SolvenciaTecnica" Class="text-end columna10Ancho" HeaderTextAlignment="Alignment.Center" HeaderText="Nº Trabajadores" PropertyName="Documentacion">
                    @context.Cantidad
                </GridColumn>
                <GridColumn TItem="LicitacionesURBAN.SolvenciaTecnica" Class="columna40Ancho" HeaderTextAlignment="Alignment.Center" HeaderText="Categoría Profesional" PropertyName="Documentacion">
                    @context.TipoConvenio
                </GridColumn>
                <GridColumn TItem="LicitacionesURBAN.SolvenciaTecnica" Class="botonesTabla columna10Ancho" HeaderText="">
                    <div class="btnTablasEspaciado">
                        <span @onclick="@(() => abrirPopupGestionDatos(@context,false))" class="btnBorrarGuardar">
                            <Icon CustomIconName="fas fa-edit"></Icon>
                        </span>
                        <span @onclick="@(() => abrirPopupConfirmarBorrado(@context))" class="btnBorrarGuardar">
                            <Icon CustomIconName="fas fa-trash"></Icon>
                        </span>
                    </div>
                </GridColumn>
            </GridColumns>
        </Grid>
        <table class="table tablaCACOA mb-0" style="position:absolute;bottom:-33px;">
            <tfoot>
                <tr>
                    <td colspan="2" class="text-end fw-bold colorC TotalesTabla">
                        <div class="d-flex justify-content-between">
                            <div class="mt-1">
                                <button @onclick="@(() => abrirPopupGestionDatos(new LicitacionesURBAN.SolvenciaTecnica(),true))" class="btnBlue d-flex align-items-center"> <i class="fas fa-plus-square pe-1"></i> Añadir Trabajadores</button>
                            </div>
                            <div style="align-self: center;">
                                Total trabajadores:
                                <span> @objetoLicitacionUrban.ListaSolvenciaTecnica.Sum(x => x.Cantidad)</span>
                            </div>
                        </div>

                    </td>
                </tr>
            </tfoot>
        </table>
        @*     <table class="table tablaCACOA tablaCACOA2 mb-0">
        <thead>
            <tr>
                <th class="colorA fw-bold">Equipo de trabajo mínimo</th>
                <th class="colorA fw-bold text-end"></th>
            </tr>
        </thead>
        <tbody>
            <tr>
                <td class="colorFilasIntro w4"><p>Titulado grado superior</p>  </td>
                <td class="text-end align-content-center">
                    <div>
                        <InputNumber TValue="int" Locale="es-ES" Min="0" class="inputForm formatoMoneda" Value="@objetoLicitacionUrban.minimoGradoSuperior" ValueExpression="() => objetoLicitacionUrban.minimoGradoSuperior" ValueChanged="(value) => MinimoSupCambiado(value)"></InputNumber>
                    </div>
                </td>
            </tr>

            <tr>
                <td class="colorFilasIntro w4"><p>Titulado grado medio</p>  </td>
                <td class="text-end align-content-center">
                    <div>
                        <InputNumber TValue="int" Locale="es-ES" Min="0" class="inputForm formatoMoneda" Value="@objetoLicitacionUrban.minimoGradoMedio" ValueExpression="() => objetoLicitacionUrban.minimoGradoMedio" ValueChanged="(value) => MinimoMedCambiado(value)"></InputNumber>
                    </div>
                </td>
            </tr>
        </tbody>
    </table> *@
    </div>
</div>


@code {
    [CascadingParameter]
    public HerramientaCASA.Components.Pages.LicitacionesURBAN _Parent { get; set; }

    [Parameter]
    public bdHerramientaCACOA.LicitacionesURBAN objetoLicitacionUrban { get; set; } = new bdHerramientaCACOA.LicitacionesURBAN();

    private bool nuevaRedaccion = false;

    public List<CASA.enumeracionesCASA> listadoInstrumentos { get; set; } = new List<CASA.enumeracionesCASA>();

    private LicitacionesURBAN.SolvenciaTecnica itemSeleccionado = new LicitacionesURBAN.SolvenciaTecnica();
    private LicitacionesURBAN.SolvenciaTecnica itemSeleccionadoTemporal { get; set; } = new LicitacionesURBAN.SolvenciaTecnica();


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

    [Parameter]
    public string? idSimulador { get; set; } = "";

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

    private EditContext editContext;

    private bool nuevoElemento;
    private ValidationMessageStore? messageStore;
    List<LicitacionesURBAN.SolvenciaTecnica> listaSolvenciaTecnica;

    protected override async Task OnInitializedAsync()
    {
        editContext = new EditContext(itemSeleccionado);
        messageStore = new ValidationMessageStore(editContext);

        listaSolvenciaTecnica = objetoLicitacionUrban.ListaSolvenciaTecnica.ToList();
    }

    private async Task abrirPopupGestionDatos(LicitacionesURBAN.SolvenciaTecnica objeto, bool esNuevo)
    {
        itemSeleccionado = objeto;

        if (esNuevo)
        {
            nuevoElemento = true;
            itemSeleccionadoTemporal = new LicitacionesURBAN.SolvenciaTecnica();

        }
        else
        {
            nuevoElemento = false;
            itemSeleccionadoTemporal = new LicitacionesURBAN.SolvenciaTecnica()
                {
                    idConvenioColectivo = objeto.idConvenioColectivo,
                    Cantidad = objeto.Cantidad,
                    Descripcion = objeto.Descripcion
                };
        }

        if (!nuevoElemento)
        {
            tituloPopup = "Modificar Trabajo";
        }
        else
        {
            tituloPopup = "Añadir Trabajo";
        }
        await popupGestionDatos.ShowAsync();
    }
    private void ValidarTodo()
    {
        ValidarYActualizar(new ChangeEventArgs { Value = itemSeleccionadoTemporal.Descripcion }, nameof(itemSeleccionadoTemporal.Descripcion));
        ValidarYActualizar(new ChangeEventArgs { Value = itemSeleccionadoTemporal.Cantidad }, nameof(itemSeleccionadoTemporal.Cantidad));
        ValidarYActualizar(new ChangeEventArgs { Value = itemSeleccionadoTemporal.idConvenioColectivo }, nameof(itemSeleccionadoTemporal.idConvenioColectivo));
    }
    // GUARDAR
    private async Task guardarFormulario()
    {
        try
        {
            ValidarTodo();

            if (!editContext!.GetValidationMessages().Any())
            {
                string accion = nuevoElemento ? "create" : "update";
                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 async Task GestionarDatos(string accion)
    {

        switch (accion)
        {
            case "update":
                rellenarItem();
                objetoLicitacionUrban.ActualizarSolvenciaTecnica(itemSeleccionado);
                await cerrarPopupGestionDatos();

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

                break;

            case "create":
                rellenarItem();
                objetoLicitacionUrban.InsertarSolvenciaTecnica(itemSeleccionado);
                await cerrarPopupGestionDatos();
                mensajes.Add(new ToastMessage
                    {
                        Type = ToastType.Primary,
                        Message = $"Guardado correctamente.",
                    });
                break;

            case "delete":
                objetoLicitacionUrban.EliminarSolvenciaTecnica(itemSeleccionado);

                await cerrarPopupConfirmarBorrado();
                mensajes.Add(new ToastMessage
                    {
                        Type = ToastType.Primary,
                        Message = $"Eliminado correctamente.",
                    });
                break;
        }
        listaSolvenciaTecnica = objetoLicitacionUrban.ListaSolvenciaTecnica.ToList();
        await InvokeAsync(StateHasChanged);
        _Parent.RefreshState();
    }
    private async Task BorrarItem()
    {
        await GestionarDatos("delete");
    }
    private void MostrarErrores()
    {
        // messageStore?.Clear();
        // foreach (var field in new[] { nameof(itemSeleccionadoTemporal.Coste), nameof(itemSeleccionadoTemporal.idTrabajo) })
        // {
        //     ValidarYActualizar(new ChangeEventArgs { Value = typeof(CASA.OtrosTrabajos).GetProperty(field)?.GetValue(itemSeleccionadoTemporal) }, field);
        // }
    }
    private void ValidarYActualizar(ChangeEventArgs e, string fieldName)
    {
        var value = e.Value?.ToString();
        var field = new FieldIdentifier(itemSeleccionadoTemporal, fieldName);

        switch (fieldName)
        {
            case nameof(itemSeleccionadoTemporal.Descripcion):
                itemSeleccionadoTemporal.Descripcion = value;
                break;
            case nameof(itemSeleccionadoTemporal.Cantidad):
                if (value == "")
                {
                    value = "0";
                }                    
                string parseado = value;//.Replace(",", ".");
                itemSeleccionadoTemporal.Cantidad = int.Parse(parseado, CultureInfo.InvariantCulture);
                break;
            case nameof(itemSeleccionadoTemporal.idConvenioColectivo):

                if (!string.IsNullOrEmpty(value))
                {

                    itemSeleccionadoTemporal.idConvenioColectivo = int.Parse(value);
                }
                else
                {
                    itemSeleccionadoTemporal.idConvenioColectivo = 0;
                }

                break;
        }

        messageStore?.Clear(field);
        if (fieldName == nameof(itemSeleccionadoTemporal.Descripcion) && itemSeleccionadoTemporal.Descripcion == "")
        {
            messageStore?.Add(field, "Rellene este campo");
        }
        if (fieldName == nameof(itemSeleccionadoTemporal.Cantidad) && itemSeleccionadoTemporal.Cantidad <= 0)
        {
            messageStore?.Add(field, "El Nº Trabajadores debe ser mayor que 0.");
        }

        if (fieldName == nameof(itemSeleccionadoTemporal.idConvenioColectivo) && itemSeleccionadoTemporal.idConvenioColectivo == 0)
        {
            messageStore?.Add(field, "Seleccione uno.");
        }

        editContext?.NotifyValidationStateChanged();
    }
    //////// PopUp eliminar registro
    private async Task abrirPopupConfirmarBorrado(LicitacionesURBAN.SolvenciaTecnica objeto)
    {
        itemSeleccionado = objeto;
        await popupConfirmarBorrado.ShowAsync();
    }
    private async Task cerrarPopupConfirmarBorrado()
    {
        await popupConfirmarBorrado.HideAsync();
    }
    private async Task cerrarPopupGestionDatos()
    {
        await popupGestionDatos.HideAsync();
    }
    private void rellenarItem()
    {
        itemSeleccionado.idConvenioColectivo = itemSeleccionadoTemporal.idConvenioColectivo;
        itemSeleccionado.Cantidad = itemSeleccionadoTemporal.Cantidad;
        itemSeleccionado.Descripcion = itemSeleccionadoTemporal.Descripcion;
        itemSeleccionado.TipoConvenio = objetoLicitacionUrban.Enumerados.ListaGrupoTrabajadores.First(x => x.idEnumeracion == itemSeleccionado.idConvenioColectivo).ValorAlfabetico1;

    }
    private string GetExternalValidationMessage(string fieldName)
    {
        var field = new FieldIdentifier(itemSeleccionadoTemporal, fieldName);
        return messageStore?[field].FirstOrDefault() ?? string.Empty;
    }
    /*
    private async Task MinimoSupCambiado(int valor)
    {
        if (valor < 1)
        {
            objetoLicitacionUrban.minimoGradoSuperior = 1;
            }
        else
        {
            objetoLicitacionUrban.minimoGradoSuperior = valor;
            }
        await _Parent.CalcularTabla(objetoLicitacionUrban.idProvincia);
        _Parent.RefreshState();
        }
    private async Task MinimoMedCambiado(int valor)
    {

        objetoLicitacionUrban.minimoGradoMedio = valor;
        await _Parent.CalcularTabla(objetoLicitacionUrban.idProvincia);
        }*/
}
