@page "/TiposTramosSiltra"
@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> Tipos tramos SILTRA</b></small></h6>
        <button @onclick="@(() => abrirPopupModificacion(new TIPOSTRAMOS(), true))" class="btnOAAFAzul">Nuevo </button>
    </div>

    @if (lTiposTramoSiltra == null)
    {
        <div id="cargando" class="loadingFrame">
            <div class="loadingImg"></div>
        </div>
    }
    else if (!lTiposTramoSiltra.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="TIPOSTRAMOS"
                  Class="table tablaRegPers"
                  Data="@lTiposTramoSiltra"
                  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="TIPOSTRAMOS" HeaderText="">
                        <button @onclick="@(() => abrirPopupModificacion(@context, false))" class="btnOAAFAzul">Editar</button>
                    </GridColumn>
                    <GridColumn TItem="TIPOSTRAMOS" HeaderText="Código" PropertyName="CODIGO" FilterButtonCSSClass="hidden" SortKeySelector="item => item.CODIGO">
                        @context.CODIGO
                    </GridColumn>
                    <GridColumn TItem="TIPOSTRAMOS" HeaderText="Descripción" PropertyName="DESCRIPCION" FilterButtonCSSClass="hidden" SortKeySelector="item => item.DESCRIPCION">
                        @context.DESCRIPCION
                    </GridColumn>
                    <GridColumn TItem="TIPOSTRAMOS" HeaderText="Código Tramo Acumulado" PropertyName="IDCODIGOTRAMOACUMULA" FilterButtonCSSClass="hidden">
                        @if (@context.IDCODIGOTRAMOACUMULA != null)
                        {
                            lTiposTramoSiltra.First(x => x.IDCODIGOTRAMOACUMULA == @context.IDCODIGOTRAMOACUMULA);
                        }
                    </GridColumn>
                    <GridColumn TItem="TIPOSTRAMOS" HeaderText="Solicitado Al Usuario" PropertyName="SOLICITADOALUSUARIO" FilterButtonCSSClass="hidden" SortKeySelector="item => item.SOLICITADOALUSUARIO">
                        @if (context.SOLICITADOALUSUARIO)
                        {
                            <i class="fa-regular fa-square-check"></i>
                        }
                    </GridColumn>
                    <GridColumn TItem="TIPOSTRAMOS" HeaderText="Regimen Aplicación" PropertyName="IDREGIMENAPLICACION" FilterButtonCSSClass="hidden" >
                        @if (@context.IDREGIMENAPLICACION != null)
                        {
                            lRegimenAplicacion.First(x => x.IDENUMERACION == @context.IDREGIMENAPLICACION);
                        }
                    </GridColumn>
                    <GridColumn TItem="TIPOSTRAMOS" HeaderText="Tipo Fichero XML" PropertyName="IDTIPOTRAMOFICHEROXML" FilterButtonCSSClass="hidden">
                        @if (@context.IDTIPOTRAMOFICHEROXML != null)
                        {
                            lTipoFicheroXml.First(x => x.IDENUMERACION == @context.IDTIPOTRAMOFICHEROXML);
                        }
                    </GridColumn>
                    <GridColumn TItem="TIPOSTRAMOS" HeaderText="Solicitado Al Usuario" PropertyName="SEMANDAIMPORTEEMPRESA" FilterButtonCSSClass="hidden" SortKeySelector="item => item.SEMANDAIMPORTEEMPRESA">
                        @if (context.SEMANDAIMPORTEEMPRESA)
                        {
                            <i class="fa-regular fa-square-check"></i>
                        }
                    </GridColumn>
                    <GridColumn TItem="TIPOSTRAMOS" HeaderText="Solicitado Al Usuario" PropertyName="MODIFICABLE" FilterButtonCSSClass="hidden" SortKeySelector="item => item.MODIFICABLE">
                        @if (context.MODIFICABLE)
                        {
                            <i class="fa-regular fa-square-check"></i>
                        }
                    </GridColumn>
                    <GridColumn TItem="TIPOSTRAMOS" HeaderText="Solicitado Al Usuario" PropertyName="RESTAENACUMULADO" FilterButtonCSSClass="hidden" SortKeySelector="item => item.RESTAENACUMULADO">
                        @if (context.RESTAENACUMULADO)
                        {
                            <i class="fa-regular fa-square-check"></i>
                        }
                    </GridColumn>
                </GridColumns>
            </Grid>
        </div>

        <!-- Vista móvil -->
         <div class="tablaMov">
            @foreach (var itm in lTiposTramoSiltra)
            {
                var collapseId = $"collapse{itm.IDTIPOTRAMOS}";
                <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.DESCRIPCION</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">Descripcion</dt>
                                <dd class="col-sm-9">@itm.DESCRIPCION</dd>
                                <dt class="col-sm-3">Código Tramo Acumulado</dt>
                                <dd class="col-sm-9">
                                    @if (@itm.IDCODIGOTRAMOACUMULANavigation != null)
                                    {
                                        @itm.IDCODIGOTRAMOACUMULANavigation.CODIGO
                                    }
                                    </dd>
                                <dt class="col-sm-3">Solicitado al usuario</dt>
                                <dd class="col-sm-9">
                                    @itm.SOLICITADOALUSUARIO
                                    
@*                                     @if(itm.OBSOLETO)
                                    {
                                        <i class="fa-regular fa-square-check"></i>
                                    }
                                    else
                                    {
                                        <i class="fa-regular fa-square-uncheck"></i>
                                    } *@
                                </dd>
                                <dt class="col-sm-3">Regimen Aplicación</dt>
                                <dd class="col-sm-9">@itm.IDREGIMENAPLICACIONNavigation</dd>
                                <dt class="col-sm-3">Tipo Fichero XML</dt>
                                <dd class="col-sm-9">
                                    @if (@itm.IDTIPOTRAMOFICHEROXMLNavigation != null)
                                    {
                                        @itm.IDTIPOTRAMOFICHEROXMLNavigation.DESCRIPCION
                                    }
                                </dd>
                                <dt class="col-sm-3">Se Manda Importe a Empresa</dt>
                                <dd class="col-sm-9">
                                    @itm.SEMANDAIMPORTEEMPRESA

                                    @*                                     @if(itm.OBSOLETO)
                                    {
                                        <i class="fa-regular fa-square-check"></i>
                                    }
                                    else
                                    {
                                        <i class="fa-regular fa-square-uncheck"></i>
                                    } *@
                                </dd>
                                <dt class="col-sm-3">Modificable</dt>
                                <dd class="col-sm-9">
                                    @itm.MODIFICABLE

                                    @*                                     @if(itm.OBSOLETO)
                                    {
                                        <i class="fa-regular fa-square-check"></i>
                                    }
                                    else
                                    {
                                        <i class="fa-regular fa-square-uncheck"></i>
                                    } *@
                                </dd>
                                <dt class="col-sm-3">Resta en Acumulado</dt>
                                <dd class="col-sm-9">
                                    @itm.RESTAENACUMULADO

                                    @*                                     @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="TiposTramoSiltraForm">
    <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">Descripción: </label>
                    <input class="form-control" id="txtEDesc" @bind-value="@ItemEnEdicion.DESCRIPCION" />
                </div>
                <div class="col-md-12">
                    <label for="txtEDesc" class="fw-bold">Codigo Tramo Acumulado: </label>
                    <InputSelect @bind-Value="@ItemEnEdicion.IDCODIGOTRAMOACUMULA" class="form-select">
                        <option value="">Seleccionar</option>
                        @if (lTiposTramoSiltra != null)
                        {
                            @foreach (var enumera in lTiposTramoSiltra)
                            {
                                <option value="@enumera.IDTIPOTRAMOS">@enumera.DESCRIPCION</option>
                            }
                        }
                    </InputSelect>
                </div>
                <div class="col-md-12">
                    <label for="txtEDesc" class="fw-bold">Regimen Aplicación: </label>
                    <InputSelect @bind-Value="ItemEnEdicion.IDREGIMENAPLICACION" class="form-select">
                        <option value="">Seleccionar</option>
                        @if (lRegimenAplicacion != null)
                        {
                            @foreach (var enumera in lRegimenAplicacion)
                            {
                                <option value="@enumera.IDENUMERACION">@enumera.DESCRIPCION</option>
                            }
                        }
                    </InputSelect>
                </div>
                <div class="col-md-12">
                    <label for="txtEDesc" class="fw-bold">Tipo Fichero XML: </label>
                    <InputSelect @bind-Value="ItemEnEdicion.IDTIPOTRAMOFICHEROXML" class="form-select">
                        <option value="">Seleccionar</option>
                        @if (lTipoFicheroXml != null)
                        {
                            @foreach (var enumera in lTipoFicheroXml)
                            {
                                <option value="@enumera.IDENUMERACION">@enumera.DESCRIPCION</option>
                            }
                        }
                    </InputSelect>
                </div>
                <div class="col-md-6">
                    <label for="" class="fw-bold">Se Manda Importe a Empresa: </label>
                    <input type="checkbox" class="form-check" id="chkECotizaSS" checked="@ItemEnEdicion.SEMANDAIMPORTEEMPRESA" @bind-value="@ItemEnEdicion.SEMANDAIMPORTEEMPRESA" />
                </div>
                <div class="col-md-6">
                    <label for="" class="fw-bold">Modificable: </label>
                    <input type="checkbox" class="form-check" id="chkECotizaSS" checked="@ItemEnEdicion.MODIFICABLE" @bind-value="@ItemEnEdicion.MODIFICABLE" />
                </div>
                <div class="col-md-6">
                    <label for="" class="fw-bold">Resta en Acumulado: </label>
                    <input type="checkbox" class="form-check" id="chkECotizaSS" checked="@ItemEnEdicion.RESTAENACUMULADO" @bind-value="@ItemEnEdicion.RESTAENACUMULADO" />
                </div>
                <div class="col-md-6">
                    <label for="" class="fw-bold">Solicitado Al Usuario: </label>
                    <input type="checkbox" class="form-check" id="chkECotizaSS" checked="@ItemEnEdicion.SOLICITADOALUSUARIO" @bind-value="@ItemEnEdicion.SOLICITADOALUSUARIO" />
                </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<TIPOSTRAMOS> lTiposTramoSiltra = new List<TIPOSTRAMOS>();
    private List<TIPOSTRAMOS> banco = new List<TIPOSTRAMOS>();

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

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

    private List<ENUMERACIONES> lTipoFicheroXml = new List<ENUMERACIONES>();
    private List<ENUMERACIONES> lRegimenAplicacion = new List<ENUMERACIONES>();

    private string _filter = "";
    public string Filter
    {
        get => _filter;
        set
        {
            if (_filter != value)
            {
                _filter = value;
                AplicarFiltros();
            }
        }
    }
    private void AplicarFiltros()
    {
        lTiposTramoSiltra = banco.Where(per =>
            string.IsNullOrEmpty(Filter) ||
            Utilidades.RemoveDiacritics(per.CODIGO).Contains(Utilidades.RemoveDiacritics(Filter), StringComparison.OrdinalIgnoreCase) ||
            Utilidades.RemoveDiacritics(per.DESCRIPCION.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("/TIPOSTRAMOS");
            var resultContent = await resultPersonas.Content.ReadAsStringAsync();
            banco = JsonConvert.DeserializeObject<List<TIPOSTRAMOS>>(resultContent)
                       ?? new List<TIPOSTRAMOS>();
        }
        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/TIPOSTRAMOS");
            var resultContent = await resultPersonas.Content.ReadAsStringAsync();
            banco = JsonConvert.DeserializeObject<List<TIPOSTRAMOS>>(resultContent)
                       ?? new List<TIPOSTRAMOS>();
        }

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

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

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

        lTiposTramoSiltra = banco;

        lTipoFicheroXml = await Utilidades.ObtenerObjeto<List<ENUMERACIONES>>(cliente, "/api/ENUMERACIONES/EnumeracionesGrupo/TIPTRAXML");
        lRegimenAplicacion = await Utilidades.ObtenerObjeto<List<ENUMERACIONES>>(cliente, "/api/ENUMERACIONES/EnumeracionesGrupo/REGAPL");

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

        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<TIPOSTRAMOS>(lTiposTramoSiltra);
        var cliente = Utilidades.ObtenerCliente(UserState.Token, HttpClientFactory);

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

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

                break;
        }
        cerrarPopupModificacion();
        lTiposTramoSiltra = 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);
        // }
    }
}

