@page "/FicherosMaestros/Adscripciones"
@using System.Net.Http.Headers
@using System.Linq.Expressions
@using Newtonsoft.Json
@using System.Text
@using Serialize.Linq.Serializers
@using RegistroPersonalAN.Models
@using BlazorBootstrap
@using bdAntifraude.db
@inject IHttpClientFactory HttpClientFactory
@inject IHttpContextAccessor HttpContextAccessor
@inject UserState UserState
@rendermode InteractiveServer
<div class="pagina">
    <div class="Cabecera">
        <h6><small><i class="fas fa-copy"></i><b> Adscripciones</b></small></h6>
    </div>
    <Toasts class="p-3 font-weight-bold" Style="color:white;" AutoHide="true" Delay="4000" Messages="mensajes" Placement="ToastsPlacement.BottomCenter" />
    <input type="button" value="Nueva adscripción" @onclick="@(() => abrirPopupGestionDatos(new ADSCRIPCION()))" class="btnOAAFBlack" />

    @if (listaItems == null)
    {
        <p>Cargando datos...</p>
    }
    else if (!listaItems.Any())
    {
        <p>No se encontraron datos para mostrar.</p>
    }
    else
    {
        <div class="form-group mt-4">
            <input class="form-control" type="text" placeholder="Filtrar..."
                   @bind-value="Filter" @bind-value:event="oninput"  />
        </div>
        <Grid TItem="ADSCRIPCION"
              Class="table tablaRegPers"
              Data="listaItemsfilt"
              AllowFiltering="false"
              PageSize="20"
              AllowPaging="true"
              EmptyText="No se han encontrado datos"
              AllowSorting="true"
              Height="100"
              PageSizeSelectorVisible="false"
              PageSizeSelectorItems="@(new int[] { 5,10,20,50 })"
              Responsive="true"
              PaginationItemsTextFormat="{0} - {1} de {2} elementos">

            <GridColumns>
                <GridColumn TItem="ADSCRIPCION" Class="col-2" HeaderText="Adscripción" PropertyName="ADSCRIPCION1" SortKeySelector="item => item.ADSCRIPCION1">
                    @context.ADSCRIPCION1
                </GridColumn>
                <GridColumn TItem="ADSCRIPCION" Class="col-8" HeaderText="Descripción" PropertyName="DESCRIPCION" SortKeySelector="item => item.DESCRIPCION">
                    @context.DESCRIPCION
                </GridColumn>
                <GridColumn TItem="ADSCRIPCION" Class="col-1" HeaderText="Activo" PropertyName="ACTIVO" SortKeySelector="item => item.ACTIVO">
                    @if (context.ACTIVO)
                    {
                        <i class="fa fa-check"></i>
                    }
                </GridColumn>
                <GridColumn TItem="ADSCRIPCION" HeaderText="">
                    <span @onclick="@(() => abrirPopupGestionDatos(@context))" style="cursor: pointer;">
                        <Icon CustomIconName="fas fa-edit"></Icon>
                    </span>
                    <span @onclick="@(() => abrirPopupConfirmarBorrado(@context))" style="cursor: pointer;">
                        <Icon CustomIconName="fas fa-trash"></Icon>
                    </span>
                </GridColumn>
            </GridColumns>

        </Grid>
    }

    <Modal @ref="popupGestionDatos" title="@tituloPopup" IsVerticallyCentered="true" UseStaticBackdrop="true" CloseOnEscape="false">
        <BodyTemplate>
            <div class="row">
                <div class="col-12 formatoCampos">
                    <label class="tituloLbl">Adscripción:</label>
                    <InputText required @bind-Value="itemSeleccionado.ADSCRIPCION1" class="inputForm" DisplayName="Adscripción" maxlength="3"></InputText>
                </div>
                <div class="col-12 formatoCampos">
                    <label class="tituloLbl">Descripcion:</label>
                    <InputText required @bind-Value="itemSeleccionado.DESCRIPCION" class="inputForm" DisplayName="Descripción"></InputText>
                    @* <ValidationMessage For=@(() => itemSeleccionado.DESCRIPCION) /> *@
                </div>
                <div class="col-12" style="margin-top:10px;">
                    <label class="tituloLbl">Activo:</label>
                    <InputCheckbox required @bind-Value="itemSeleccionado.ACTIVO" class="inputForm"></InputCheckbox>
                </div>
            </div>


        </BodyTemplate>
        <FooterTemplate>
            <Button Color="ButtonColor.Secondary" @onclick="cerrarPopupGestionDatos">Cerrar</Button>
            @if (itemSeleccionado.IDADSCRIPCION != 0)
            {
                <Button @onclick="@(() => GestionarDatos("update"))" Color="ButtonColor.Primary">Modificar</Button>
            }
            else
            {
                <Button @onclick="@(() => GestionarDatos("create"))" Color="ButtonColor.Primary">Añadir</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>

</div>
@code {
    private string partialUri="ADSCRIPCION";
    private List<ADSCRIPCION> listaItems = new List<ADSCRIPCION>();
    private List<ADSCRIPCION> listaItemsfilt = new List<ADSCRIPCION>();
    private string _filter = "";
    public string Filter
    {
        get => _filter;
        set
        {
            if (_filter != value)
            {
                _filter = value;
                AplicarFiltros();
            }
        }
    }
    private HttpClient cliente = new HttpClient();

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

    // private ADSCRIPCION item = new ADSCRIPCION();
    private ADSCRIPCION itemSeleccionado = new ADSCRIPCION();
    private int idItem = 0;
    List<ToastMessage> mensajes = new List<ToastMessage>();


    public bool IsVisible(ADSCRIPCION listPersonas)
    {
        if (string.IsNullOrEmpty(Filter))
            return true;

        if (Utilidades.RemoveDiacritics(listPersonas.ADSCRIPCION1).Contains(Utilidades.RemoveDiacritics(Filter), StringComparison.OrdinalIgnoreCase))
            return true;
        if (Utilidades.RemoveDiacritics(listPersonas.DESCRIPCION).Contains(Utilidades.RemoveDiacritics(Filter), StringComparison.OrdinalIgnoreCase))
            return true;       
        return false;
    }
    private void AplicarFiltros()
    {
        // Filtra la lista en función de los criterios ingresados
        listaItemsfilt = new List<ADSCRIPCION>();
        foreach (ADSCRIPCION per in listaItems)
        {
            if (IsVisible(per) == true)
            {
                listaItemsfilt.Add(per);
            }
        }
    }

    protected override async Task OnInitializedAsync()
    {
        try
        {
            cliente = Utilidades.ObtenerCliente(UserState.Token, HttpClientFactory);
            await ObtenerLista();
        }
        catch (Exception e)
        {
            Console.WriteLine($"Error al obtener los datos: {e.Message}");
        }
    }
    private async Task ObtenerLista()
    {
        listaItems = await Utilidades.ObtenerObjeto<List<ADSCRIPCION>>(cliente, "/api/" + partialUri);
        listaItemsfilt = listaItems;
    }

    private async Task abrirPopupGestionDatos(ADSCRIPCION objeto)
    {
        itemSeleccionado = objeto;
        idItem = itemSeleccionado.IDADSCRIPCION;


        if (idItem != 0)
        {
            tituloPopup = "Modificar Adscripción";
        }
        else
        {
            tituloPopup = "Nueva Adscripción";
        }
        await popupGestionDatos.ShowAsync();
    }
    private async Task cerrarPopupGestionDatos()
    {
        await popupGestionDatos.HideAsync();
    }
    private async Task GestionarDatos(string accion)
    {
        switch (accion)
        {
            case "update":
                var responsea = await cliente.PutAsJsonAsync("/api/" + partialUri + "/" + itemSeleccionado.IDADSCRIPCION, itemSeleccionado);
                await cerrarPopupGestionDatos();

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

                break;

            case "create":
                var response = await cliente.PostAsJsonAsync("/api/" + partialUri, itemSeleccionado);
                await cerrarPopupGestionDatos();
                mensajes.Add(new ToastMessage
                    {
                        Type = ToastType.Primary,
                        Message = $"Guardado correctamente.",
                    });
                break;

            case "delete":
                var responsed = await cliente.DeleteAsync("/api/" + partialUri + "/" + itemSeleccionado.IDADSCRIPCION);
                await cerrarPopupConfirmarBorrado();
                mensajes.Add(new ToastMessage
                    {
                        Type = ToastType.Primary,
                        Message = $"Eliminado correctamente.",
                    });
                break;
        }
        await ObtenerLista();
        await InvokeAsync(StateHasChanged);
    }
    private async Task BorrarItem()
    {
       await  GestionarDatos("delete");
    }


    private async Task abrirPopupConfirmarBorrado(ADSCRIPCION objeto)
    {
        itemSeleccionado = objeto;
        await popupConfirmarBorrado.ShowAsync();
    }
    private async Task cerrarPopupConfirmarBorrado()
    {
        await popupConfirmarBorrado.HideAsync();
    }
}
