@page "/Variables"
@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" />

<EditForm EditContext="@editContext" OnValidSubmit="guardarFormulario" OnInvalidSubmit="@MostrarErrores" FormName="variableForm">
    <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 @bind-Value="descripcionItem" @oninput="e => ValidarYActualizar(e, nameof(descripcionItem))" class="inputForm"></InputText>
                </div>
                <div class="validation-message">@GetExternalValidationMessage(nameof(descripcionItem))</div>
            </div>
            <div class="row">
                <div class="col-12 formatoCampos pt-2">
                    <label class="tituloLbl">Valor numérico:</label>
                    <InputNumber TValue="double?" @bind-Value="valorNumericoItem"
                                 @oninput="e => ValidarYActualizar(e, nameof(valorNumericoItem))"
                                 class="inputForm" step="any" />

                </div>
                <div class="validation-message">@GetExternalValidationMessage(nameof(valorNumericoItem))</div>
            </div>
        </BodyTemplate>
        <FooterTemplate>
            <Button Color="ButtonColor.Secondary" @onclick="cerrarPopupGestionDatos">Cerrar</Button>
            <Button Type="ButtonType.Submit" Color="ButtonColor.Primary">Modificar</Button>
        </FooterTemplate>
    </Modal>
</EditForm>
<div class="container-fluid  mt-3">
    <p><b class="Fuente2">Variables</b> </p>

    <div>
        <div class="form-group mt-4">
            <input class="form-control" type="text" style="width: 400px;" placeholder="Filtrar..."
                   @bind-value="Filter" @bind-value:after="AplicarFiltros" />
        </div>

        <Grid TItem="enumeraciones"
              Class="tablaCACOA table"
              Data="listadoVariables"
              AllowFiltering="false"
              PageSize="10"
              FixedHeader="true"
              Height="800"
              Unit="Unit.Px"
              EmptyText="No hay registros."
              PageSizeSelectorVisible="false"
              Responsive="true">
            <GridColumns>
                <GridColumn TItem="enumeraciones" HeaderTextAlignment="Alignment.Center" HeaderText="Descripción">
                    <span>@context.ValorAlfabetico1</span>
                </GridColumn>

                <GridColumn TItem="enumeraciones" Class="columna20Ancho text-end" HeaderTextAlignment="Alignment.Center" HeaderText="Valor Numérico">
                    <span>@context.ValorNumerico1</span>
                </GridColumn>

                <GridColumn TItem="enumeraciones" Class="botonesTabla" HeaderText="">
                    <div class="btnTablasEspaciado">
                        <span @onclick="@(() => abrirPopupGestionDatos(@context,false))" class="btnBorrarGuardar">
                            <Icon CustomIconName="fas fa-edit"></Icon>
                        </span>
                    </div>
                </GridColumn>
            </GridColumns>
        </Grid>
    </div>
</div>

@code {

    public List<enumeraciones> listadoVariables { get; set; } = new List<enumeraciones>();
    public List<enumeraciones> listadoVariablesAux { get; set; } = new List<enumeraciones>();

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

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

    private bool nuevoElemento;

    private string descripcionItem = "";
    private double? valorNumericoItem = 0;

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

    private EditContext? editContext;
    private ValidationMessageStore? messageStore;
    public tsHerramientasCACOA bd;


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

        editContext = new EditContext(itemSeleccionado);
        messageStore = new ValidationMessageStore(editContext);

        listadoVariables = bd.enumeraciones.Where(x=>x.Codigo.Contains("VARCASA.") && !x.Codigo.Contains("CONCOL")).ToList();
        listadoVariablesAux = listadoVariables;
    }

    private void AplicarFiltros()
    {
        // Filtra la lista en función de los criterios ingresados
        listadoVariables = new List<bdHerramientaCACOA.db.enumeraciones>();
        foreach (bdHerramientaCACOA.db.enumeraciones item in listadoVariablesAux)
        {
            if (IsVisible(item) == true)
            {
                listadoVariables.Add(item);
            }
        }
    }

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

        if (listado.ValorAlfabetico1.ToLower().Contains(Filter.ToLower(), StringComparison.OrdinalIgnoreCase))
        {
            return true;
        }

        if (listado.ValorNumerico1.ToString().Contains(Filter, StringComparison.OrdinalIgnoreCase))
        {
            return true;
        }
        return false;
    }


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

        if (!nuevoElemento)
        {
            tituloPopup = "Modificar variable";
            descripcionItem = objeto.Descripcion;
            valorNumericoItem = objeto.ValorNumerico1;
        }

        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(descripcionItem):
                if (!string.IsNullOrEmpty(value))
                {

                    descripcionItem = value;
                }
                else
                {
                    descripcionItem = "";
                }
                break;

            case nameof(valorNumericoItem):

                if (!string.IsNullOrEmpty(value))
                {
                    string parseado = value.Replace(",", ".");
                    valorNumericoItem = double.Parse(parseado, CultureInfo.InvariantCulture);
                }

                break;
        }

        messageStore?.Clear(field);
        if (fieldName == nameof(descripcionItem) && descripcionItem == "")
        {
            messageStore?.Add(field, "La descripción no puede estar vacía.");
        }

        if (fieldName == nameof(valorNumericoItem) && valorNumericoItem == null)
        {
            messageStore?.Add(field, "El valor numérico no puede estar vacío.");
        }

        editContext?.NotifyValidationStateChanged();
    }

    private void ValidarTodo()
    {
        ValidarYActualizar(new ChangeEventArgs { Value = descripcionItem }, nameof(descripcionItem));
        ValidarYActualizar(new ChangeEventArgs { Value = valorNumericoItem }, nameof(valorNumericoItem));
    }

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

    private void guardar()
    {
        var variableObtenida = bd.enumeraciones.Where(x=> x.idEnumeracion == itemSeleccionado.idEnumeracion).First();

        variableObtenida.ValorAlfabetico1 = descripcionItem;
        variableObtenida.ValorNumerico1 = valorNumericoItem;
        variableObtenida.Descripcion = descripcionItem.ToUpper();
        bd.enumeraciones.Update(variableObtenida);

        var cambiarFecha = bd.enumeraciones.First(x => x.Codigo == "CW.FECHAULTMOD");
        cambiarFecha.Fecha1 = DateTime.Now;
        bd.enumeraciones.Update(cambiarFecha);

        bd.SaveChanges();

        cerrarPopupGestionDatos();
    }

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

            if (!editContext!.GetValidationMessages().Any())
            {
                guardar();

                mensajes.Add(new ToastMessage
                    {
                        Type = ToastType.Primary,
                        Message = $"Guardado correctamente.",
                    });
            }
            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(descripcionItem), nameof(valorNumericoItem) })
        {
            ValidarYActualizar(new ChangeEventArgs { Value = typeof(enumeraciones).GetProperty(field)?.GetValue(itemSeleccionado) }, field);
        }
    }

}