@using BlazorBootstrap
@using Newtonsoft.Json
@using RegistroPersonalAN.Models
@using Serialize.Linq.Serializers
@using System.Linq.Expressions
@using System.Net.Http.Headers
@using System.Text
@using bdAntifraude.db


@inject UserState UserState
@inject IHttpClientFactory HttpClientFactory
@inject IHttpContextAccessor HttpContextAccessor
@inject NavigationManager NavigationManager

<div class="d-flex justify-content-between mt-3">
    <div></div>
    <button @onclick="@(() => abrirPopupGestionDatos(new IDIOMAS()))" class="btnOAAFAzul d-flex align-items-center"> <i class="icono-nuevo"></i> Nuevo </button>

</div>

<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>
<Modal @ref="popupGestionDatos" title="@tituloPopup" IsVerticallyCentered="true" UseStaticBackdrop="true" CloseOnEscape="false">
    <BodyTemplate>
        <div class="row">

            <div class="col-12 formatoCampos">

                <label class="tituloLbl">Idioma:</label>
                <InputSelect @bind-Value="itemSeleccionado!.IDTIPOIDIOMA" class="inputForm">
                    <option value="">-- Seleccione un idioma -- </option>

                    @foreach (var nvl in listadoTipoIdioma)
                    {
                        <option value="@nvl.IDENUMERACION">@nvl.DESCRIPCION</option>
                    }
                </InputSelect>
            </div>
           
            <div class="col-12 formatoCampos">

                <label class="tituloLbl">Nivel:</label>
                <InputSelect @bind-Value="itemSeleccionado!.IDNIVEL" class="inputForm">
                    <option value="">-- Seleccione un nivel -- </option>

                    @foreach (var nvl in listadoNivel)
                    {
                        <option value="@nvl.IDENUMERACION">@nvl.DESCRIPCION</option>
                    }
                </InputSelect>
            </div>

            <div class="col-12 formatoCampos">
                <label class="tituloLbl">Centro de expedición:</label>
                <InputText required @bind-Value="itemSeleccionado.CENTROEXPEDICION" class="inputForm"></InputText>
            </div>

            <div class="col-12 formatoCampos">
                <label class="tituloLbl">Año:</label>
                <InputNumber required @bind-Value="itemSeleccionado.ANNO" class="inputForm"></InputNumber>
            </div>
        </div>
    </BodyTemplate>
    <FooterTemplate>
        <Button Color="ButtonColor.Secondary" @onclick="cerrarPopupGestionDatos">Cerrar</Button>
        @if (itemSeleccionado.IDIDIOMA != 0)
        {
            <Button @onclick="@(() => GestionarDatos("update"))" Color="ButtonColor.Primary">Modificar</Button>
        }
        else
        {
            <Button @onclick="@(() => GestionarDatos("create"))" Color="ButtonColor.Primary">Añadir</Button>
        }
    </FooterTemplate>
</Modal>

<!-- Grid de BlazorBootstrap con la misma estética -->
<Grid TItem="IDIOMAS"
      Class="table tablaRegPers"
      Data="idiomaItems"
      AllowFiltering="false"
      PageSize="10"
      AllowPaging="true"
      AllowSorting="true"
      EmptyText="No se han encontrado datos"
      Height="100"
      PageSizeSelectorVisible="false"
      PageSizeSelectorItems="@(new int[] { 5, 10, 20, 50 })"
      Responsive="true"
      PaginationItemsTextFormat="{0} - {1} de {2} elementos">

    <GridColumns>
        <GridColumn TItem="IDIOMAS" HeaderText="Idioma" PropertyName="IdiomaNombre">
            @context.IDTIPOIDIOMANavigation?.DESCRIPCION
        </GridColumn>
        <GridColumn TItem="IDIOMAS" HeaderText="Nivel" PropertyName="Nivel">
            @context.IDNIVELNavigation?.DESCRIPCION
        </GridColumn>
        <GridColumn TItem="IDIOMAS" HeaderText="Centro de expedición" PropertyName="CentroExpedicion">
            @context.CENTROEXPEDICION
        </GridColumn>
        <GridColumn TItem="IDIOMAS" HeaderText="Año" PropertyName="Ano">
            @context.ANNO
        </GridColumn>
        <GridColumn TItem="bdAntifraude.db.IDIOMAS" 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>

@code {
    [Parameter]
    public PERSONAS Persona { get; set; } = new PERSONAS();

    private List<IDIOMAS> idiomaItems = new();
    private HttpClient cliente = new HttpClient();

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

    private IDIOMAS itemSeleccionado = new IDIOMAS();
    private List<ENUMERACIONES> listadoTipoIdioma = new List<ENUMERACIONES>();
    private List<ENUMERACIONES> listadoNivel = new List<ENUMERACIONES>();
    List<ToastMessage> mensajes = new List<ToastMessage>();




    protected override async Task OnInitializedAsync()
    {
        try
        {

            cliente = Utilidades.ObtenerCliente(UserState.Token, HttpClientFactory);

            if (Persona?.IDPERSONA != null && Persona!.IDPERSONA > 0)
            {
                await ObtenerLista();
                listadoTipoIdioma = await rellenarLitadoEnum("TIPIDI");
                listadoNivel = await rellenarLitadoEnum("NIVIDI");
            }
            else
            {
                Console.WriteLine("Persona no está completamente cargada.");
            }

        }
        catch (Exception e)
        {
            Console.WriteLine($"Error al obtener los datos: {e.Message}");
        }
    }

    private async Task ObtenerLista()
    {
        idiomaItems = await Utilidades.ObtenerObjeto<List<IDIOMAS>>(cliente, "/api/IDIOMAS/GetWithIncludes/" + Persona.IDPERSONA);
    }

    private async Task<List<ENUMERACIONES>> rellenarLitadoEnum(string buscarGrupo)
    {
        try
        {
            Expression<Func<ENUMERACIONES, bool>> filtro = x => x.CODIGO!.Contains(buscarGrupo);

            List<ENUMERACIONES> enumsEncontrado = await Utilidades.ObtenerObjeto<List<ENUMERACIONES>>(cliente, "/api/ENUMERACIONES/filtrar", filtro);

            return enumsEncontrado;
        }
        catch (Exception e)
        {
            Console.WriteLine($"Error al obtener los datos: {e.Message}");
            throw new Exception("Mensaje.", e);
        }
    }
    private async Task abrirPopupGestionDatos(IDIOMAS objeto)
    {
        itemSeleccionado = objeto;

        if (itemSeleccionado.IDIDIOMA != 0)
        {
            tituloPopup = "Modificar Idioma";
        }
        else
        {
            tituloPopup = "Nuevo Idioma";
        }
        await popupGestionDatos.ShowAsync();
    }
    private async Task cerrarPopupGestionDatos()
    {
        await popupGestionDatos.HideAsync();
    }
    private async Task GestionarDatos(string accion)
    {
        itemSeleccionado.IDPERSONA = Persona.IDPERSONA;
        switch (accion)
        {
            case "update":
                var responsea = await Utilidades.ActualizarObjeto(cliente, "/api/IDIOMAS/" + itemSeleccionado.IDIDIOMA, itemSeleccionado);
                await cerrarPopupGestionDatos();

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

                break;

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

            case "delete":
                var responsed = await cliente.DeleteAsync("/api/IDIOMAS/" + itemSeleccionado.IDIDIOMA);
                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(IDIOMAS objeto)
    {
        itemSeleccionado = objeto;
        await popupConfirmarBorrado.ShowAsync();
    }
    private async Task cerrarPopupConfirmarBorrado()
    {
        await popupConfirmarBorrado.HideAsync();
    }
}