@page "/Bancos"
@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="Cabecera">
        <h6><small><i class="fas fa-user"></i><b> Bancos</b></small></h6>
        <button @onclick="@(() => abrirPopupModificacion(new BANCOS(), true))" class="btnOAAFAzul">Nuevo </button>
    </div>

    @if (lBancos == null)
    {
        <div id="cargando" class="loadingFrame">
            <div class="loadingImg"></div>
        </div>
    }
    else if (!lBancos.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="tablaDesk">
            <Grid TItem="BANCOS"
                  Class="table tablaRegPers"
                  Data="@lBancos"
                  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="BANCOS" HeaderText="">
                        <button @onclick="@(() => abrirPopupModificacion(@context, false))" class="btnOAAFAzul">Editar</button>
                    </GridColumn>
                    <GridColumn TItem="BANCOS" HeaderText="Código" PropertyName="CODIGO" FilterButtonCSSClass="hidden" SortKeySelector="item => item.CODIGO">
                        @context.CODIGO
                    </GridColumn>
                    <GridColumn TItem="BANCOS" HeaderText="Nombre" PropertyName="NOMBRE" FilterButtonCSSClass="hidden" SortKeySelector="item => item.NOMBRE">
                        @context.NOMBRE
                    </GridColumn>
                     <GridColumn TItem="BANCOS" HeaderText="BIC" PropertyName="BIC" FilterButtonCSSClass="hidden" SortKeySelector="item => item.BIC">
                        @context.BIC
                    </GridColumn>
                    <GridColumn TItem="BANCOS" HeaderText="Obsoleto" PropertyName="OBSOLETO" FilterButtonCSSClass="hidden" SortKeySelector="item => item.OBSOLETO">
                        @if (context.OBSOLETO)
                        {
                            <i class="fa-regular fa-square-check"></i>
                        }
                    </GridColumn>
                    @*<GridColumn TItem="TIPOSPUESTOSTRABAJO" HeaderText="Tipo" PropertyName="IDTIPOPERSONANavigation.DESCRIPCION" FilterButtonCSSClass="hidden">
                        @context.IDTIPOPERSONANavigation.DESCRIPCION
                    </GridColumn> 
                    <GridColumn TItem="BANCOS" HeaderText="Fecha baja" PropertyName="FECHABAJA" TextNoWrap="true" FilterButtonCSSClass="hidden" SortKeySelector="item => item.FECHABAJA">
                        @if (context.FECHABAJA != null)
                        {
                            @context.FECHABAJA
                        }

                    </GridColumn> *@

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

        <!-- Vista móvil -->
         <div class="tablaMov">
            @foreach (var itm in lBancos)
            {
                var collapseId = $"collapse{itm.IDBANCO}";
                <div class="card collapse-card Aceptada">
                    <div class="card-header mb-1" data-bs-toggle="collapse" data-bs-target="#@collapseId" aria-expanded="false" aria-controls="@collapseId">
                        <h5 class="mb-0">@itm.NOMBRE</h5>
                    </div>
                    <div id="@collapseId" class="collapse">
                        <div class="card-body">
                            <dl class="row">
                                <dt class="col-sm-3">Código</dt>
                                <dd class="col-sm-9">@itm.CODIGO</dd>
                                <dt class="col-sm-3">Nombre</dt>
                                <dd class="col-sm-9">@itm.NOMBRE</dd>
                                <dt class="col-sm-3">BIC</dt>
                                <dd class="col-sm-9">@itm.BIC</dd>
                                <dt class="col-sm-3">Obsoleto</dt>
                                <dd class="col-sm-9">
                                    @itm.OBSOLETO
                                    
@*                                     @if(itm.OBSOLETO)
                                    {
                                        <i class="fa-regular fa-square-check"></i>
                                    }
                                    else
                                    {
                                        <i class="fa-regular fa-square-uncheck"></i>
                                    } *@
                                </dd> 
                                 <dd class="col-sm-12">
                                    <button @onclick="@(() => abrirPopupModificacion(@itm, true))" class="btnOAAFAzul">Editar </button>
                                </dd>
                            </dl>
                        </div>
                    </div>
                </div>
            }
        </div>
    }
</div>
<EditForm EditContext="@editContext" OnValidSubmit="GuardarCambiosPopup" OnInvalidSubmit="@MostrarErroresPopup" FormName="costeIndiForm">
    <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">Codigo: </label>
                    <input class="form-control" id="txtEDesc" @bind-value="@ItemEnEdicion.CODIGO" />
                </div>
                <div class="col-md-12">
                    <label for="txtEDesc" class="fw-bold">Nombre: </label>
                    <input class="form-control" id="txtEDesc" @bind-value="@ItemEnEdicion.NOMBRE" />
                </div>
                <div class="col-md-12">
                    <label for="txtEDesc" class="fw-bold">BIC: </label>
                    <input class="form-control" id="txtEDesc" @bind-value="@ItemEnEdicion.BIC" />
                </div>
                <div class="col-md-4">
                    <label for="" class="fw-bold">Obsoleto: </label>
                    <input type="checkbox" class="form-check" id="chkECotizaSS" checked="@ItemEnEdicion.OBSOLETO" @bind-value="@ItemEnEdicion.OBSOLETO" />
                </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 {
    private List<BANCOS> lBancos = new List<BANCOS>();
    private List<BANCOS> banco = new List<BANCOS>();

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

    List<ToastMessage> mensajes = new List<ToastMessage>();
    private EditContext? editContext;


    private string _filter = "";
    public string Filter
    {
        get => _filter;
        set
        {
            if (_filter != value)
            {
                _filter = value;
                AplicarFiltros();
            }
        }
    }
    private void AplicarFiltros()
    {
        lBancos = banco.Where(per =>
            string.IsNullOrEmpty(Filter) ||
            Utilidades.RemoveDiacritics(per.CODIGO).Contains(Utilidades.RemoveDiacritics(Filter), StringComparison.OrdinalIgnoreCase) ||
            Utilidades.RemoveDiacritics(per.NOMBRE.ToString()).Contains(Utilidades.RemoveDiacritics(Filter), StringComparison.OrdinalIgnoreCase) ||
            Utilidades.RemoveDiacritics(per.BIC.ToString()).Contains(Utilidades.RemoveDiacritics(Filter), StringComparison.OrdinalIgnoreCase)
           ).ToList();
        UserState.CurrentPage = 1;
    }
    // Bandera que indica si se está en modo "Ver Todos"
    private bool verTodosActive = false;

    private async Task ToggleVerTodos()
    {
        if (!verTodosActive)
        {
            verTodosActive = true;
            var token = UserState.Token;
            var client = HttpClientFactory.CreateClient();
            client.BaseAddress = new Uri(Utilidades.urlSwagger());
            client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);
            client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

            var resultPersonas = await client.GetAsync("/BANCOS");
            var resultContent = await resultPersonas.Content.ReadAsStringAsync();
            banco = JsonConvert.DeserializeObject<List<BANCOS>>(resultContent)
                       ?? new List<BANCOS>();
        }
        else
        {
            verTodosActive = false;
            var token = UserState.Token;
            var client = HttpClientFactory.CreateClient();
            client.BaseAddress = new Uri(Utilidades.urlSwagger());
            client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);
            client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

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

        banco = banco
            .OrderBy(x => x.CODIGO)           
            .ToList();

        lBancos = banco;
        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(lBancos);
        var resultPersonas = await cliente.GetAsync("/api/BANCOS");
        var resultContent = await resultPersonas.Content.ReadAsStringAsync();
        banco = JsonConvert.DeserializeObject<List<BANCOS>>(resultContent)
                   ?? new List<BANCOS>();

        banco = banco.OrderBy(x => x.CODIGO)
            .ToList();

        lBancos = banco;


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

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

    // GUARDAR
    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 copia = new List<BANCOS>(lBancos);
        var cliente = Utilidades.ObtenerCliente(UserState.Token, HttpClientFactory);

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

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

                break;
        }
        cerrarPopupModificacion();
        lBancos = copia.OrderBy(x => x.CODIGO).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);
        // }
    }
}

