@page "/InfoActoAdministrativo/"
@using System.Net.Http.Headers
@using System.Linq.Expressions
@using Layout
@using Microsoft.AspNetCore.WebUtilities
@using Newtonsoft.Json
@using System.Text
@using RegistroPersonalAN.Components.ViewsModels
@using Serialize.Linq.Serializers
@using RegistroPersonalAN.Models
@using BlazorBootstrap
@using bdAntifraude.db


@rendermode InteractiveServer

@inject NavigationManager NavigationManager
@layout MainLayout
@inject IHttpClientFactory HttpClientFactory
@inject IHttpContextAccessor HttpContextAccessor
@inject UserState UserState
@inject NavigationManager Navigation



<Modal @ref="popupConfirmacion" 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="cerrarPopupConfirmacion">Cerrar</Button>
        <Button @onclick="@(() => borrarActoAdm())" Color="ButtonColor.Danger">Eliminar</Button>
    </FooterTemplate>
</Modal>
<div class="pagina">
    <Toasts class="p-3 font-weight-bold" Style="color:white;" AutoHide="true" Delay="4000" Messages="messages" Placement="ToastsPlacement.BottomCenter" />
    <div class="Cabecera">
        <h6><small><i class="fas fa-handshake"></i><b> Acto administrativo (<a id="lblNombre" href="@LINKPERSONA">@usuarioActo</a> )</b></small></h6>
    </div>

    <div>
        <EditForm FormName="FormInfoViAd" EditContext="@editContext" OnValidSubmit="guardarFormulario" OnInvalidSubmit="@MostrarErrores" class="formDtosAdmin">
            <DataAnnotationsValidator />

            <div class="botonera col-12 gap-1" style="display:flex">


                <button class="btnOAAFAzul" @onclick="volver" title="Volver"><i class=" fas fa-long-arrow-alt-left"></i></button>
                <button type="submit" class="btnOAAFAzul" title="Guardar"><i class="fas fa-save"></i></button>
                <button class="btnOAAFAzul" Disabled=@ocultarBtnMod hidden="@ocultarBtnMod" @onclick="abrirPopupConfirmacion" title="Eliminar"><i class="fas fa-trash"></i></button>
                <button class="btnOAAFAzul" Disabled=@ocultarBtnNew hidden="@ocultarBtnNew" @onclick="limpiarModel" title="Limpiar"><i class="fas fa-eraser"></i></button>
@* 
                <Button Class="p-0" @onclick="volver"><Icon CustomIconName="iconBtn fas fa-long-arrow-alt-left"></Icon> </Button>
               
                <Button  Class="p-0" Type="ButtonType.Submit"> <Icon CustomIconName="iconBtn  fas fa-save"></Icon> </Button>
                
                <Button Class="p-0" Disabled=@ocultarBtnMod hidden="@ocultarBtnMod" @onclick="abrirPopupConfirmacion">  <Icon CustomIconName="iconBtn  fas fa-trash"></Icon> </Button>
                <Button Disabled=@ocultarBtnNew Class="p-0" hidden="@ocultarBtnNew" @onclick="limpiarModel" Type="ButtonType.Button"> <Icon CustomIconName="iconBtn fas fa-eraser"></Icon> </Button>
        *@     </div>

            <div class="areaMenu m-0">
                <div class="camposficha row">
                    <div class="col-3 formatoCampos">
                        <label class="tituloLbl">Descripción:</label>
                        <InputText @bind-Value="Model!.DESCRIPCION" class="inputForm" />
                            <div class="validation-message">@GetExternalValidationMessage(nameof(Model.DESCRIPCION))</div>
                    </div>
                    <div class="col-3 formatoCampos">
                        <label class="tituloLbl">Motivo administrativo:</label>


                        <input @bind="filterText" @bind:event="oninput" @onfocus="ShowDropdown" @onblur="HideDropdownAfterDelay"
                               placeholder="Seleccione un motivo administrativo" class="inputForm col-12" />

                        @if (showDropdown)
                        {
                            <div class="dropdown-list" style="z-index: 10; border: solid; max-height: 400px; display: block; background: white; position: absolute; width: auto; overflow-x: hidden; margin-top:80px;">
                                @foreach (var puesto in FiltrarPuestos(listadoMotivosAdmin, filterText))
                                {
                                    <div class="dropdown-item" style="cursor:default" @onclick="() => SelectPuesto(puesto)">
                                        @puesto.DESCRIPCION
                                    </div>
                                }
                            </div>
                        }
@* 
                        <InputSelect @bind-Value="Model!.IDMOTIVOADMINISTRATIVO" class="inputForm" @bind-Value:after="cambiarActoAdmin">
                            <option value="0">-- Seleccione un motivo --</option>
                            @foreach (var solicitud in listadoMotivosAdmin)
                            {
                                <option value="@solicitud.IDMOTIVO">@solicitud.DESCRIPCION</option>
                            }
                        </InputSelect> *@
                        <div class="validation-message">@GetExternalValidationMessage(nameof(Model.IDMOTIVOADMINISTRATIVO))</div>

                    </div>
                    <div class="col-3 formatoCampos">
                        <label class="tituloLbl">Acto administrativo:</label>
                        <InputText @bind-Value="@actoAdminitrativoDesc" class="inputForm" disabled="true" />
                    </div>
                    <div class="col-3 formatoCampos">
                        <label class="tituloLbl">Fecha:</label>
                        <InputDate @bind-Value="Model.FECHA" class="inputForm"></InputDate>
                    </div>
                    <div class="col-3 formatoCampos">
                        <label class="tituloLbl">Texto 1:</label>
                        <InputText @bind-Value="Model.TEXTO1" class="inputForm" />
                    </div>
                    <div class="col-3 formatoCampos">
                        <label class="tituloLbl">Texto 2:</label>
                        <InputText @bind-Value="Model.TEXTO2" class="inputForm" />
                    </div>
                    <div class="col-3 formatoCampos">
                        <label class="tituloLbl">Texto 3:</label>
                        <InputText @bind-Value="Model.TEXTO3" class="inputForm" />
                    </div>
                </div>
            </div>
        </EditForm>

    </div>


</div>


@code {
    // ATRIBUTOS
    private Modal popupConfirmacion = default!;
    private bool showDropdown { get; set; }
    private string filterText { get; set; } = "";
    public string idInfoActoAdministrativo { get; set; } = "";
    [SupplyParameterFromForm]
    private ACTOSADMINPREP? Model { get; set; } = new ACTOSADMINPREP();
    public string? per { get; set; }
    public PERSONAS persona { get; set; } = new PERSONAS();
    public HttpResponseMessage personaLink { get; set; } = new HttpResponseMessage();
    private string LINKPERSONA { get; set; } = "";
    List<ToastMessage> messages = new List<ToastMessage>();
    private string usuarioActo { get; set; } = "";
    public bool ocultarBtnNew { get; set; } = false;
    public bool ocultarBtnMod { get; set; } = false;
    public string actoAdminitrativoDesc { get; set; } = "";
    private string linkVolver { get; set; } = "";
    private HttpClient cliente = new HttpClient();

    private EditContext? editContext;
    private ValidationMessageStore? messageStore;

    // LISTADOS PARA COMBOBOX
    private List<MOTIVOS_ADMINISTRATIVOS> listadoMotivosAdmin = new List<MOTIVOS_ADMINISTRATIVOS>();
    protected void volver() { Navigation.NavigateTo(linkVolver, forceLoad: true); }
    protected override async Task OnInitializedAsync()
    {
        try
        {

            editContext = new EditContext(Model);
            messageStore = new ValidationMessageStore(editContext);

            var client = Utilidades.ObtenerCliente(UserState.Token, HttpClientFactory);
            var serializer = new ExpressionSerializer(new Serialize.Linq.Serializers.JsonSerializer());

            //Obtenemos la persona
            var uri = NavigationManager.ToAbsoluteUri(NavigationManager.Uri);
            if (QueryHelpers.ParseQuery(uri.Query).TryGetValue("per", out var clValue))
            {
                per = clValue;
                string idPerDesencriptado = tsUtilidades.crypt.FEncS(per, "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890.:/-*", "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890.:/-*", -875421649);
                personaLink = await client.GetAsync("/api/PERSONAS/" + idPerDesencriptado.ToString());
                var PersContent = await personaLink.Content.ReadAsStringAsync();
                if (personaLink.IsSuccessStatusCode)
                {
                    persona = JsonConvert.DeserializeObject<PERSONAS>(PersContent) ?? new PERSONAS();
                    usuarioActo = persona.APELLIDOS + "," + persona.NOMBRE;
                    LINKPERSONA = "/infoPersonas?cl=" + tsUtilidades.crypt.FEncS(persona.NIF, "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890.:/-*", "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890.:/-*", 875421649);

                }
            }
            if (QueryHelpers.ParseQuery(uri.Query).TryGetValue("ia", out var cliaValue))
            {
                string idPerDesencriptado = tsUtilidades.crypt.FEncS(per, "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890.:/-*", "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890.:/-*", -875421649);
                per = idPerDesencriptado;

                personaLink = await client.GetAsync("/api/PERSONAS/" + idPerDesencriptado.ToString());
                var PersContent = await personaLink.Content.ReadAsStringAsync();
                if (personaLink.IsSuccessStatusCode)
                {
                    persona = JsonConvert.DeserializeObject<PERSONAS>(PersContent) ?? new PERSONAS();
                }
                idInfoActoAdministrativo = tsUtilidades.crypt.FEncS(cliaValue, "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890.:/-*", "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890.:/-*", -875421649);
            }

            //Cargamos lista de motivos administrativo
            var MotAdm = await client.GetAsync("/api/MOTIVOS_ADMINISTRATIVOS/");
            var UniAdmContent = await MotAdm.Content.ReadAsStringAsync();
            if (MotAdm.IsSuccessStatusCode) { 
                listadoMotivosAdmin = JsonConvert.DeserializeObject<List<MOTIVOS_ADMINISTRATIVOS>>(UniAdmContent) ?? new List<MOTIVOS_ADMINISTRATIVOS>();
                listadoMotivosAdmin.OrderBy(motAd => motAd.DESCRIPCION);
            }

            if (idInfoActoAdministrativo == "0" || string.IsNullOrEmpty( idInfoActoAdministrativo))
            {
                ocultarBtnNew = false;
                ocultarBtnMod = true;
            }
            else
            {
                ocultarBtnNew = true;
                ocultarBtnMod = false;
                var response = await client.GetAsync("/api/ACTOSADMINPREP/MotivosExtend/" + idInfoActoAdministrativo.ToString());
                var ResponseContent = await response.Content.ReadAsStringAsync();
                if (response.IsSuccessStatusCode)
                {
                    Model = JsonConvert.DeserializeObject<ACTOSADMINPREP>(ResponseContent);
                    actoAdminitrativoDesc = Model?.IDMOTIVOADMINISTRATIVONavigation?.IDTIPOAPTOSNavigation?.DESCRIPCION ?? "";
                }

            }

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


            linkVolver = "/infoPersonas?cl=" + tsUtilidades.crypt.FEncS(persona.NIF, "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890.:/-*", "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890.:/-*", 875421649);
        }
        catch (Exception e)
        {
            Console.WriteLine($"Error al obtener los datos: {e.Message}");
        }
    }
    private void ShowDropdown()
    {
        showDropdown = true;
    }
    private async void HideDropdownAfterDelay()
    {
        // Pequeño delay para no cerrar el dropdown antes de poder hacer clic
        // (opcional, puedes eliminarlo si no es necesario)
        await Task.Delay(200);
        showDropdown = false;
        StateHasChanged();
    }
    private IEnumerable<MOTIVOS_ADMINISTRATIVOS> FiltrarPuestos(IEnumerable<MOTIVOS_ADMINISTRATIVOS> puestos, string text)
    {
        if (string.IsNullOrWhiteSpace(text))
        {
            // Sin texto: muestra todos
            return puestos.OrderBy(p => p.DESCRIPCION);
        }
        else
        {
            // Con texto: filtramos
            return puestos
            .Where(p => Utilidades.RemoveDiacritics(p.DESCRIPCION).Contains(Utilidades.RemoveDiacritics(text), StringComparison.OrdinalIgnoreCase))
            .OrderBy(p => p.DESCRIPCION);
        }
    }
    private void SelectPuesto(MOTIVOS_ADMINISTRATIVOS puesto)
    {
        filterText = puesto.DESCRIPCION;
        Model!.IDMOTIVOADMINISTRATIVO = puesto.IDMOTIVO;
        showDropdown = false;
    }
    //LIMPIAR MODEL
    private void limpiarModel()
    {
        Model = new ACTOSADMINPREP();
        actoAdminitrativoDesc = "";
    }
    // GUARDAR
    private async Task guardarFormulario()
    {
        try
        {
            ValidarTodo();

            if (!editContext!.GetValidationMessages().Any())
            {
                await guardarActosAdm();

                messages.Add(new ToastMessage
                    {
                        Type = ToastType.Primary,
                        Message = $"Guardado correctamente.",
                    });
            }
            else
            {
                messages.Add(new ToastMessage
                    {
                        Type = ToastType.Warning,
                        Message = $"Debe rellenar los campos obligatorios.",
                    });
            }

        }
        catch (Exception)
        {
            messages.Add(new ToastMessage
                {
                    Type = ToastType.Danger,
                    Message = $"Error al guardar.",
                });
        }

    }  
    // GUARDAR
    private async Task guardarActosAdm()
    {
        if ( idInfoActoAdministrativo != "0" && !string.IsNullOrEmpty(idInfoActoAdministrativo))
        {//Actualizar registro
            Model!.IDMOTIVOADMINISTRATIVONavigation = null;
            await Utilidades.ActualizarObjeto<ACTOSADMINPREP>(cliente, "/api/ACTOSADMINPREP/" + Model!.IDACTOADMINISTRATIVO, Model!);
        }
        else
        {//Crear Nuevo
            Model!.IDPERSONA = persona.IDPERSONA;
            await Utilidades.NuevoObjeto<ACTOSADMINPREP>(cliente, "/api/ACTOSADMINPREP", Model!);
            volver();
        }
    }
    private async Task cambiarActoAdmin()
    {
        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 nuevoId = Model!.IDMOTIVOADMINISTRATIVO;

        if(nuevoId != 0)
        {
            //Obtenemos el nuevo motivo
            var MotAdm = await client.GetAsync("/api/MOTIVOS_ADMINISTRATIVOS/TiposExtend/" + nuevoId);
            var UniAdmContent = await MotAdm.Content.ReadAsStringAsync();
            if (MotAdm.IsSuccessStatusCode)
            {
                var mot = JsonConvert.DeserializeObject<MOTIVOS_ADMINISTRATIVOS>(UniAdmContent);
                //Seteamos su descripcion
                actoAdminitrativoDesc = mot?.IDTIPOAPTOSNavigation?.DESCRIPCION ?? "";
            }
        }
        else
        {
                actoAdminitrativoDesc = "";
        }

    }
    // ELIMINAR
    private async Task borrarActoAdm()
    {

        var responsed = await cliente.DeleteAsync("/api/ACTOSADMINPREP/" + idInfoActoAdministrativo);

        await cerrarPopupConfirmacion();

        volver();
    }
    private async Task abrirPopupConfirmacion()
    {
        await popupConfirmacion.ShowAsync();
    }
    private async Task cerrarPopupConfirmacion()
    {
        await popupConfirmacion.HideAsync();
    }
    private void ValidarYActualizar(ChangeEventArgs e, string fieldName)
    {
        var value = e.Value?.ToString();
        var field = new FieldIdentifier(Model, fieldName);

        switch (fieldName)
        {
            case nameof(Model.IDMOTIVOADMINISTRATIVO):
                if (!string.IsNullOrEmpty(value))
                {

                    Model.IDMOTIVOADMINISTRATIVO = int.Parse(value);
                }
                else
                {
                    Model.IDMOTIVOADMINISTRATIVO = 0;
                }
                break;

            case nameof(Model.DESCRIPCION): Model.DESCRIPCION = value; break;

        }

        messageStore?.Clear(field);

        if (fieldName == nameof(Model.IDMOTIVOADMINISTRATIVO) && Model.IDMOTIVOADMINISTRATIVO == 0)
        {
            messageStore?.Add(field, "Seleccione un motivo administrativo.");
        }

        if (fieldName == nameof(Model.DESCRIPCION) && string.IsNullOrEmpty(Model.DESCRIPCION))
        {
            messageStore?.Add(field, "La descripción es obligatoria.");
        }
        else if (fieldName == nameof(Model.DESCRIPCION) && Model!.DESCRIPCION!.Length > 100)
        {

            messageStore?.Add(field, "La descripción no puede tener más de 100 caracteres.");
        }


        editContext?.NotifyValidationStateChanged();
    }
    private void ValidarTodo()
    {
        ValidarYActualizar(new ChangeEventArgs { Value = Model?.IDMOTIVOADMINISTRATIVO }, nameof(Model.IDMOTIVOADMINISTRATIVO));
        ValidarYActualizar(new ChangeEventArgs { Value = Model?.DESCRIPCION }, nameof(Model.DESCRIPCION));
    }
    private string GetPlaceholder(string fieldName)
    {
        var field = new FieldIdentifier(Model, fieldName);
        return messageStore?[field].FirstOrDefault() ?? string.Empty;
    }
    private string GetExternalValidationMessage(string fieldName)
    {
        var field = new FieldIdentifier(Model, fieldName);
        return messageStore?[field].FirstOrDefault() ?? string.Empty;
    }
    private string GetCssClass(string fieldName)
    {
        var field = new FieldIdentifier(Model, fieldName);
        return messageStore![field].Any() ? "is-invalid" : string.Empty;
    }
    private void MostrarErrores()
    {
        messageStore?.Clear();
        foreach (var field in new[] { nameof(Model.IDMOTIVOADMINISTRATIVO), nameof(Model.DESCRIPCION) })
        {
            ValidarYActualizar(new ChangeEventArgs { Value = typeof(ACTOSADMINPREP).GetProperty(field)?.GetValue(Model) }, field);
        }
    }


}
