@page "/InfoPersonas"
@page "/InfoPersonas/{cl}"
@using BlazorBootstrap
@using Newtonsoft.Json
@using RegistroPersonalAN.Components.Layout
@using RegistroPersonalAN.Components.Pages.InfoPersonasComponents
@using Microsoft.AspNetCore.WebUtilities
@using RegistroPersonalAN.Models
@using System.Linq.Expressions
@using Serialize.Linq.Serializers
@using System.Net.Http.Headers
@using bdAntifraude.clases
@using bdAntifraude.db
@using System.Reflection
@using Microsoft.AspNetCore.Components.Server.ProtectedBrowserStorage
@inject IJSRuntime JSRuntime
@inject IJSRuntime JS
@rendermode InteractiveServer
@inject NavigationManager NavigationManager
@inject IHttpClientFactory HttpClientFactory
@inject IHttpContextAccessor HttpContextAccessor
@inject UserState UserState
@inject ProtectedSessionStorage ProtectedSessionStore
@inject NavigationManager Navigation

@if (mostrar)
{
    <div id="cargando" class="loadingFrame">
        <div class="loadingImg"></div>
    </div>
}
<div class="pagina">
    <div class="Cabecera">
        <Toasts class="p-3 font-weight-bold" Style="color:white;" AutoHide="true" Delay="4000" Messages="mensajes" Placement="ToastsPlacement.BottomCenter" />
        <h6><small><i class="fas fa-user"></i><b> Información de la Persona ( @lblNombre )</b></small></h6>
        <div class="mb-1">
            <button class="btnOAAFAzul" @onclick="volver" title="Volver"><i class="fas fa-long-arrow-alt-left"></i></button>
            <button class="btnOAAFAzul" @onclick="abrirGuardar" title="Guardar persona"><i class="fas fa-save"></i></button>
            <button class="btnOAAFAzul" hidden="@mostrarBtn" title="Eliminar persona"><i class="fas fa-trash"></i></button>
            <button class="btnOAAFAzul" hidden="@mostrarBtn" @onclick="imprimirHojaAcreditaciones">Obtener Hoja de Acreditación de Datos</button>
        </div>
    </div>
    
        <Modal @ref="popupConfirmacion" Title="Confirmar Guardar persona" IsVerticallyCentered="true" UseStaticBackdrop="true" CloseOnEscape="false">
            <BodyTemplate>
                <p>Se van a dar de alta o modificar datos de la persona seleccionada ¿desea continuar?</p>
            </BodyTemplate>
            <FooterTemplate>
                <Button Color="ButtonColor.Secondary" @onclick="CerrarConfirmacion">Cancelar</Button>
               
                    <Button @onclick="GuardarPersona" Color="ButtonColor.Primary">Aceptar</Button>
              
            </FooterTemplate>
        </Modal>
    
    @if (persona == null)
    {
        <p>Cargando datos...</p>
    }
    else if (!canRenderTabs)
    {
        <p>Preparando interfaz...</p>
    }
    else
    {
        //OnValidSubmit="@Guardar" OnInvalidSubmit="@ValidarTodos"
        <EditForm EditContext="@editContext">
        <DataAnnotationsValidator />
            <Tabs @ref=tabsPrincipal OnShown="@(args => OnTabShownAsync(args))">
            <Tab Title="Datos Personales" Name="tabDtsPersonales">
                <Content>
                    <DatosPersonales Persona="persona" OnValidationStateChanged="@ActualizarEstadoFormulario" messageStore="@messageStore"></DatosPersonales>
                </Content>
            </Tab>
                <Tab Title="Datos Administrativos" Name="tabDtsAdm">
                <Content>
                    <DatosAdministrativos Persona="persona"></DatosAdministrativos>
                </Content>
            </Tab>
            @if (persona.IDPERSONA != 0)
            {
                    <Tab Title="Actos Administrativos" Name="tabActsAdm">
                    <Content>
                        <ActosAdministrativosPrepGrid Persona="persona"></ActosAdministrativosPrepGrid>
                    </Content>
                </Tab>
            }
        </Tabs>
        </EditForm>
    }

</div>

@code {
    [Parameter]
    public string? cl { get; set; } = "";
    private bool mostrarGuardar = false;
    private bool canRenderTabs = false;
    private PERSONAS persona = new PERSONAS();
    private string errorMessage = "";
    private HttpClient cliente = new HttpClient();
    private string lblNombre = "";
    public bool mostrar { get; set; } = true;
    public bool mostrarBtn { get; set; } = false;
    private Tabs tabsPrincipal { get; set; } = new Tabs();
    private Modal popupConfirmacion = default!;
    List<ToastMessage> mensajes = new List<ToastMessage>();
    private async Task abrirGuardar()
    {
        await popupConfirmacion.ShowAsync();
    }
    private async Task CerrarConfirmacion()
    {
        await popupConfirmacion.HideAsync();
    }
    protected void volver() { Navigation.NavigateTo("/ListadoPersonas", forceLoad: true); }
    private async Task OnTabShownAsync(TabsEventArgs args)
    {
        var panelActivo = args.ActiveTabName;

        await ProtectedSessionStore.SetAsync("ultiPanelActivo", panelActivo);

    }
    protected override async Task OnAfterRenderAsync(bool firstRender)
    {
        if (firstRender)
        {
            mostrar = true;
            canRenderTabs = true;
            StateHasChanged();

            var nombreTabsActivo = await ProtectedSessionStore.GetAsync<string>("ultiPanelActivo");

            if (nombreTabsActivo.Value != null)
            {
                await tabsPrincipal.ShowTabByNameAsync(nombreTabsActivo.Value);
            }
            mostrar = false;
        }

    }
    private EditContext editContext = default!;
    private ValidationMessageStore? messageStore;

    private void EstablecerPersona(PERSONAS nuevaPersona)
    {
        persona = nuevaPersona;
        editContext = new EditContext(persona);
        messageStore = new ValidationMessageStore(editContext);
        listaIdentificadores.Clear();
    }

    protected override async Task OnInitializedAsync()
    {
        EstablecerPersona(new PERSONAS());

        try
        {
            var url = NavigationManager.ToAbsoluteUri(NavigationManager.Uri);

            if (QueryHelpers.ParseQuery(url.Query).TryGetValue("cl", out var clValue))
            {
                cl = clValue;
            }

            if (string.IsNullOrEmpty(cl))
            {
                EstablecerPersona(new PERSONAS());
                lblNombre = "";
                mostrarBtn = true;
                mostrar = false;
                return;
            }

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

            string nifDesencriptado = tsUtilidades.crypt.FEncS(cl,
                "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890.:/-*",
                "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890.:/-*",
                -875421649);

            var response = await cliente.GetAsync($"/api/PERSONAS/nif/{nifDesencriptado}");
            if (!response.IsSuccessStatusCode)
            {
                throw new Exception($"Error al obtener los datos de la persona. Código: {response.StatusCode}");
            }

            var resultContent = await response.Content.ReadAsStringAsync();
            var personaCargada = JsonConvert.DeserializeObject<PERSONAS>(resultContent) ?? throw new Exception("Error al deserializar los datos de la persona.");
            EstablecerPersona(personaCargada);
            lblNombre = persona.NOMBRE + " " + persona.APELLIDOS;

            mostrar = false;

        }
        catch (Exception ex)
        {
            errorMessage = ex.Message;
            Console.WriteLine($"Error durante la inicialización: {ex.Message}");
            mostrar = false;
        }
        finally
        {
            mostrar = false;
        }
    }
    private async Task GuardarPersona(MouseEventArgs e)
    {
        CerrarConfirmacion();
        cliente = Utilidades.ObtenerCliente(UserState.Token, HttpClientFactory);
        ValidarTodos();
        if (!editContext.GetValidationMessages().Any())

        {
            persona.AÑOCAMBIORESIDENCIA = 0;

            //Te quedaste en que tienes que coger la foto del navigation y guardarla (Por cierto el nuevo no aparece en la lista)
            if (persona.IDFICHEROFOTONavigation != null)
            {
                FICHEROS fi = persona.IDFICHEROFOTONavigation;
                if (persona.IDFICHEROFOTO != null)
                {
                    var responsef = await Utilidades.ActualizarObjeto(cliente, "/api/FICHEROS/"+fi.IDFICHERO, fi);
                    persona.IDFICHEROFOTO = responsef.IDFICHERO;

                }
                else

                {
                    var responsef = await Utilidades.NuevoObjeto(cliente, "/api/FICHEROS", fi);
                    persona.IDFICHEROFOTO = responsef.IDFICHERO;
                }
            }

            if (persona.IDPERSONA == 0)//Nuevo
            {

                var response = await Utilidades.NuevoObjeto(cliente, "/api/PERSONAS", persona);
                string link = "/infoPersonas?cl=" + tsUtilidades.crypt.FEncS(response.NIF, "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890.:/-*", "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890.:/-*", 875421649);
                NavigationManager.NavigateTo(link, forceLoad: true);

            }
            else//Actualizar
            {
                var responsea = await Utilidades.ActualizarObjeto(cliente, "/api/PERSONAS/" + persona.IDPERSONA, persona);
                var url = NavigationManager.ToAbsoluteUri(NavigationManager.Uri);
                if (QueryHelpers.ParseQuery(url.Query).TryGetValue("cl", out var clValue)){cl = clValue;}                
                cliente = Utilidades.ObtenerCliente(UserState.Token, HttpClientFactory);
                string nifDesencriptado = tsUtilidades.crypt.FEncS(cl,
                    "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890.:/-*",
                    "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890.:/-*",
                    -875421649);
                var response = await cliente.GetAsync($"/api/PERSONAS/nif/{nifDesencriptado}");
                if (!response.IsSuccessStatusCode)
                {
                    throw new Exception($"Error al obtener los datos de la persona. Código: {response.StatusCode}");
                }

                var resultContent = await response.Content.ReadAsStringAsync();
                var personaActualizada = JsonConvert.DeserializeObject<PERSONAS>(resultContent) ?? throw new Exception("Error al deserializar los datos de la persona.");
                EstablecerPersona(personaActualizada);
                lblNombre = persona.NOMBRE + " " + persona.APELLIDOS;
                mensajes.Add(new ToastMessage
                    {
                        Type = ToastType.Primary,
                        Message = $"Guardado correctamente.",
                    });
            }
        }
        else
        {
            var html = "";
            html += "Revise los errores antes de guardar:";
            foreach (string m in editContext.GetValidationMessages())
            {
                html += "\n" + m + ". ";
            }

            mensajes.Add(new ToastMessage
                {
                    Type = ToastType.Danger,
                   
                    Message = html,
                    
                });

        }

    }
    protected void ActualizarEstadoFormulario(string fieldName)
    {
        ValidarCampo(fieldName);
    }
    List<FieldIdentifier> listaIdentificadores = new List<FieldIdentifier>();
    private void ValidarCampo(string fieldName)
    {
        FieldIdentifier field;
        var rr = listaIdentificadores.FirstOrDefault(x => x.FieldName == fieldName);
        if (rr.FieldName != null)
        {
            field = rr;
        }
        else
        {
            field = new FieldIdentifier(persona, fieldName);
            listaIdentificadores.Add(field);
        }

        messageStore?.Clear(field);

        switch (fieldName)
        {
            case nameof(persona.NIF):
                var nif = persona.NIF;
                if (string.IsNullOrWhiteSpace(persona.NIF))
                {
                    messageStore?.Add(field, "El DNI es obligatorio.");
                }
                else if (!tsUtilidades.Utilidades.ValidateNif(ref nif))
                {
                    messageStore?.Add(field, "El DNI es incorrecto.");
                }
                persona.NIF = nif;
                break;
            case nameof(persona.NOMBRE):
                if (string.IsNullOrWhiteSpace(persona.NOMBRE))
                {
                    messageStore?.Add(field, "El Nombre es obligatorio");
                }
                else if (persona.NOMBRE.Length > 45)
                {
                    messageStore?.Add(field, "El Nombre no puede ser mayor de 45 caracteres");
                }
                break;
            case nameof(persona.APELLIDOS):
                if (string.IsNullOrWhiteSpace(persona.APELLIDOS))
                {
                    messageStore?.Add(field, "El Apellido es obligatorio");
                }
                else if (persona.APELLIDOS.Length > 100)
                {
                    messageStore?.Add(field, "El Apellido no puede ser mayor de 45 caracteres");
                }
                break;
            case nameof(persona.IDSEXO):
                if (persona.IDSEXO==null)
                {
                    messageStore?.Add(field, "El Sexo es obligatorio");
                }
                break;
            case nameof(persona.FECHAALTA):
                if (persona.FECHAALTA == null)
                {
                    messageStore?.Add(field, "Debe introducir una fecha de alta");
                }
                break;
            case nameof(persona.IDADSCRIPCIONRPT):
                if (persona.IDSEXO == null)
                {
                    messageStore?.Add(field, "Selecione una clase");
                }
                break;
        }

        if (fieldName == nameof(persona.CODIGOPOSTAL) && string.IsNullOrWhiteSpace(persona.CODIGOPOSTAL))
            messageStore?.Add(field, "El código postal es obligatorio.");
        if (fieldName == nameof(persona.CORREOELECTRONICO) &&
            !string.IsNullOrWhiteSpace(persona.CORREOELECTRONICO) &&
            !persona.CORREOELECTRONICO.Contains("@"))
            messageStore?.Add(field, "El correo debe ser válido.");


        editContext.NotifyValidationStateChanged();
    }
    private void Guardar()
    {
        Console.WriteLine("Formulario válido. Datos guardados.");
    }
    private void ValidarTodos()
    {
        messageStore?.Clear();
        foreach (var field in persona.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance))
        {
            ValidarCampo(field.Name);
        }
    }
    private async void imprimirHojaAcreditaciones()
    {
        mostrar = true;

        NifPersona objetoConsulta = new NifPersona();
        var nif = persona.NIF;
        objetoConsulta.Nif = nif;


        var token = UserState.Token;
        var client = HttpClientFactory.CreateClient();
        client.BaseAddress = new Uri(Utilidades.urlSwagger2());
        // client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);
        client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

        var response = await client.PostAsJsonAsync("/api/ObtenerHAD", objetoConsulta);

        var content = await response.Content.ReadAsStringAsync();

        var ficheroObtenido = JsonConvert.DeserializeObject<ResultadoObtenerHAD>(content);
        if (ficheroObtenido.Resultado == 0)
        {
            // string fichBase64 = Convert.ToBase64String(ficheroObtenido.HAD);
            await JS.InvokeVoidAsync("downloadFile", ficheroObtenido.HAD, "HojaAcreditaciones_" + persona.APELLIDOS + "-" + persona.NOMBRE + ".pdf");
        }
        mostrar = false;
        StateHasChanged();
    }
    protected override void OnAfterRender(bool firstRender)
    {
        if (firstRender)
        {
            JS.InvokeVoidAsync("PreventEnterKey", "askQuestionForm");
        }
    }
}
<script>
    function downloadFile(base64Data, fileName) {
        const link = document.createElement("a");
        link.href = `data:application/vnd.ms-excel;base64,${base64Data}`;
        link.download = fileName;
        link.style.display = "none";
        document.body.appendChild(link);
        link.click();
        document.body.removeChild(link);
    }
    function PreventEnterKey(id) {
        var formObj = document.getElementById(id);
        formObj.addEventListener('keydown', function (event) {
            if (event.key == "Enter") {
                event.preventDefault();
                return false;
            }
        });
    }
</script>
