@page "/fiestas"
@using System.Net.Http.Headers
@using System.Linq.Expressions
@using Newtonsoft.Json
@using System.Text
@using Serialize.Linq.Serializers
@using GestionPersonalWeb.Models
@using BlazorBootstrap
@using bdAntifraude.db
@using Microsoft.AspNetCore.Components
@rendermode InteractiveServer
@inject IJSRuntime JS
@inject NavigationManager NavigationManager
@inject IHttpClientFactory HttpClientFactory
@inject IHttpContextAccessor HttpContextAccessor
@inject UserState UserState

<Toasts class="p-3 font-weight-bold" Style="color:white;" AutoHide="true" Delay="4000" Messages="mensajes" Placement="ToastsPlacement.BottomCenter" />
<div class="pagina">
    <div class="d-flex">
        <div class="cabecera">
            <h6 style="padding-top: 13px;padding-right: 15px;">
                <b>Fiestas</b>
            </h6>
        </div>
        <button @onclick="@(() => abrirPopupModificacion(new FIESTAS(), true))" class="btnOAAFAzul">Nuevo </button>
    </div>

    @if (lFiestas == null)
    {
        <div id="cargando" class="loadingFrame">
            <div class="loadingImg"></div>
        </div>
    }
    else if (!lFiestas.Any())
    {
        <p>No se encontraron datos para mostrar.</p>
    }
    else
    {
        <div class="botonera col-12 gap-1" style="display:flex;" role="group">
        </div>
        <div style="display:flex; justify-content:start; gap:15px;width:100%"></div>
        <div class="form-group mt-4 mb-4">
            <input class="form-control" type="text" placeholder="Filtrar..."
                   @bind-value="Filter" @bind-value:event="oninput" />
        </div>

        <div style="overflow-x:auto;" class="">
            <Grid TItem="FIESTAS"
                  Class="table tablaRegPers"
                  Data="@lFiestas"
                  AllowFiltering="false"
                  AllowPaging="false"
                  AllowSorting="true"
                  EmptyText="No se han encontrado datos"
                  Height="80"
                  PageSizeSelectorVisible="false"
                  Responsive="true"
                  PaginationItemsTextFormat="{0} - {1} de {2} elementos">
                <GridColumns>
                    <GridColumn TItem="FIESTAS" HeaderText="">
                        <button @onclick="@(() => abrirPopupModificacion(@context, false))" class="btnOAAFAzul">Editar</button>
                    </GridColumn>
                    <GridColumn TItem="FIESTAS" Style="width:10%" HeaderText="Fecha" PropertyName="FECHA" FilterTextboxWidth="50" FilterButtonCSSClass="hidden" SortKeySelector="item => item.FECHA">
                        @context.FECHA.Value.ToString().Substring(0,10)
                    </GridColumn>
                    <GridColumn TItem="FIESTAS" HeaderText="Descripción" PropertyName="DESCRIPCION" FilterButtonCSSClass="hidden" SortKeySelector="item => item.DESCRIPCION">
                       @context.DESCRIPCION
                    </GridColumn>


                </GridColumns>
            </Grid>
        </div>

        <!-- Vista móvil -->
       
    }
</div>
<!--Popup de edicion-->
<EditForm EditContext="@editContext" OnValidSubmit="GuardarCambiosPopup" OnInvalidSubmit="@MostrarErroresPopup" FormName="fiestasForm">
    <DataAnnotationsValidator></DataAnnotationsValidator>
    <Modal @ref="popupGestionDatos" title="@tituloPopup" IsVerticallyCentered="true" UseStaticBackdrop="true" CloseOnEscape="false">
        <BodyTemplate>
            <div class="row">
                <div class="col-md-12">
                    <label for="txtEDesc" class="fw-bold">Fecha: </label>
                    <input type="date" class="form-control" id="txtEFecha" @bind-value="@ItemEnEdicion.FECHA" />
                </div>
                <div class="col-md-12">
                    <label for="txtEDescripcion" class="fw-bold">Descripcion: </label>
                    <input class="form-control" id="txtEDescripcion" @bind-value="@ItemEnEdicion.DESCRIPCION" />
                </div>
            </div>
        </BodyTemplate>
        <FooterTemplate>
            <Button Color="ButtonColor.Secondary" @onclick="cerrarPopupModificacion">Cerrar</Button>
            <Button Type="ButtonType.Submit" Color="ButtonColor.Primary">@(EsItemNuevo ? "Añadir" : "Modificar")</Button>
        </FooterTemplate>
    </Modal>
</EditForm>
@code {
    List<FIESTAS> lFiestas = new List<FIESTAS>();
    private List<FIESTAS> fiestas = new List<FIESTAS>();
    private string _filter = "";

    private string tituloPopup = "";
    private Modal popupGestionDatos = default;
    private bool EsItemNuevo = false;
    private FIESTAS ItemEnEdicion { get; set; } = new FIESTAS();

    private EditContext? editContext;

    public string Filter
    {
        get => _filter;
        set
        {
            if (_filter != value)
            {
                _filter = value;
                AplicarFiltros();
            }
        }
    }
    private void AplicarFiltros()
    {
        lFiestas = fiestas.Where(per =>
            string.IsNullOrEmpty(Filter) ||
            Utilidades.RemoveDiacritics(per.DESCRIPCION).Contains(Utilidades.RemoveDiacritics(Filter), StringComparison.OrdinalIgnoreCase)
            ).ToList();
        UserState.CurrentPage = 1;
    }
    // Bandera que indica si se está en modo "Ver Todos"
    private bool verTodosActive = false;
    List<ToastMessage> mensajes = new List<ToastMessage>();

    private async Task ToggleVerTodos()
    {
        if (!verTodosActive)
        {
            verTodosActive = true;
            var token = UserState.Token;
            var client = Utilidades.ObtenerCliente(UserState.Token, HttpClientFactory);

            var resultPersonas = await client.GetAsync("/FIESTAS");
            var resultContent = await resultPersonas.Content.ReadAsStringAsync();
            fiestas = JsonConvert.DeserializeObject<List<FIESTAS>>(resultContent)
                       ?? new List<FIESTAS>();
        }
        else
        {
            verTodosActive = false;
            var token = UserState.Token;
            var client = Utilidades.ObtenerCliente(UserState.Token, HttpClientFactory);

            var resultPersonas = await client.GetAsync("/api/FIESTAS");
            var resultContent = await resultPersonas.Content.ReadAsStringAsync();
            fiestas = JsonConvert.DeserializeObject<List<FIESTAS>>(resultContent)
                       ?? new List<FIESTAS>();
        }

        fiestas = fiestas
            .OrderByDescending(x => x.FECHA)
            .ToList();

        lFiestas = fiestas;
        UserState.CurrentPage = 1;
        Filter = "";
    }

    protected override async Task OnInitializedAsync()
    {
        verTodosActive = false;
        var token = UserState.Token;
        var cliente = Utilidades.ObtenerCliente(UserState.Token, HttpClientFactory);
        editContext = new EditContext(lFiestas);

        var resultPersonas = await cliente.GetAsync("/api/FIESTAS");
        var resultContent = await resultPersonas.Content.ReadAsStringAsync();
        fiestas = JsonConvert.DeserializeObject<List<FIESTAS>>(resultContent)
                   ?? new List<FIESTAS>();

        fiestas = fiestas
            .OrderByDescending(x => x.FECHA)
            .ToList();

        lFiestas = fiestas;
    }

    private async Task abrirPopupModificacion(FIESTAS objeto, bool esNuevo)
    {
        ItemEnEdicion = Utilidades.ClonarObjeto(objeto);
        EsItemNuevo = esNuevo;
        if (!EsItemNuevo)
        {
            tituloPopup = "Modificando Fiesta";
        }
        else
        {
            tituloPopup = "Nueva Fiesta";
        }

        await popupGestionDatos.ShowAsync();
    }
    private async Task cerrarPopupModificacion()
    {
        await popupGestionDatos.HideAsync();
    }
    private async Task GuardarCambiosPopup()
    {
        try
        {
            ValidarDatos();

            if (!editContext!.GetValidationMessages().Any())
            {
                string accion = EsItemNuevo ? "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 async Task GestionarDatos(string accion)
    {
        var cliente = Utilidades.ObtenerCliente(UserState.Token, HttpClientFactory);
        var copia = new List<FIESTAS>(lFiestas);
        cliente = Utilidades.ObtenerCliente(UserState.Token, HttpClientFactory);

        switch (accion)
        {
            case "update":
                int indice = copia.FindIndex(x => x.IDFIESTA == ItemEnEdicion.IDFIESTA);
                if (indice > -1)
                {
                    copia[indice] = ItemEnEdicion;
                }
                var response = await Utilidades.ActualizarObjeto(cliente, "/api/FIESTAS/" + ItemEnEdicion.IDFIESTA, ItemEnEdicion, mensajes);

                break;
            case "create":
                copia.Add(ItemEnEdicion);
                var responsec = await Utilidades.NuevoObjeto(cliente, "/api/FIESTAS/", ItemEnEdicion, mensajes);
                break;
            case "delete":

                break;
        }
        cerrarPopupModificacion();
        lFiestas = copia.ToList();
        await InvokeAsync(StateHasChanged);
    }
    private void ValidarDatos()
    {

    }
    private void MostrarErroresPopup()
    {
        // messageStore?.Clear();
        // foreach (var field in new[] { nameof(descripcionItem) })
        // {
        //     ValidarYActualizar(new ChangeEventArgs { Value = typeof(enumeraciones).GetProperty(field)?.GetValue(itemSeleccionado) }, field);
        // }
    }
}

