@using BlazorBootstrap
@using Layout
@using Microsoft.AspNetCore.Mvc
@using Newtonsoft.Json
@using Newtonsoft.Json.Linq
@using GestionPersonalWeb.Models
@using System.Net.Http.Headers
@using System.Text
@using System.Linq.Expressions
@using Serialize.Linq.Serializers
@using System.Security.Cryptography.X509Certificates
@using System.Security.Cryptography
@using bdAntifraude.db

@rendermode InteractiveServer
@layout EmptyLayout
@page "/"
@inject IHttpClientFactory HttpClientFactory
@inject IHttpContextAccessor HttpContextAccessor
@inject NavigationManager Navigation
@inject UserState UserState
@inject IJSRuntime JSRuntime

<PageTitle>Registro de personal Oficina Antifraude de Andalucía</PageTitle>
<head>
    <link href="Content/Site.css?v=0.3" rel="stylesheet" />
</head>
<style>   
</style>
<link rel="icon" type="image/x-icon" href="faviconParlamento.ico" />
<link href="~/bootstrap/bootstrap.min.css" rel="stylesheet" />
<link href="Content/Site.css" rel="stylesheet" />

<div style="margin:0;padding:0;">
    @if (mostrar)
    {
        <div id="cargando" class="loadingFrame">
            <div class="loadingDiv">
                <div class="loadingImg"></div>
            </div>
        </div>
    }

    <form>
        <div id="pagina" style="background-image:url(../Content/imagenes/fondoOAAFBN.png); background-position-x:right; background-position-y:bottom; background-size:cover; background-repeat:no-repeat; display:flex; align-items:center; min-height:100vh; padding-top:200px; flex-direction:column;">
            <div style="width:100%">
                <p id="tituloLogin">Gestión de Personal</p>
            </div>
            <div id="cajaLogIn" style="display:flex; flex-direction:column; max-width:600px; background-color:white; padding:40px; border-radius:5px;">
                @* <img class="loginImg" src="Content/imagenes/1oaaflogo.png" style="width:200px; height:auto; margin-inline:auto; margin-bottom:20px;" /> *@
                <p id="mensajeError" style="color: red; margin-bottom:20px;">@mensaje</p>
                <p style="margin:0">Usuario</p>
                <input id="Usu" type="text" @bind="Usu" class="inputlogin" />
                <p style="margin:0">Contraseña</p>
                <input id="Contrasena" type="password" @bind="pass" class="inputlogin" />
                <button class="btnOAAFAzul" type="button" @onclick="LogIn">ENTRAR</button>
                <!-- Botón que inicia la autenticación vía certificado -->
                <button class="btnOAAFBlack mt-3" type="button" @onclick="IniciarSesionConCertificado">INICIAR SESIÓN CON CERTIFICADO</button>
            </div>
        </div>
    </form>
    <!-- Iframe oculto para la autenticación con certificado -->
    <iframe id="authCertIframe" style="display:none;"></iframe>
</div>

@code {
    public string? Usu { get; set; }
    public string? pass { get; set; }
    private string? mensaje { get; set; }
    public bool mostrar { get; set; } = false;
    private DotNetObjectReference<Home>? dotNetRef;

    protected override async Task OnAfterRenderAsync(bool firstRender)
    {
        if (firstRender)
        {
            // Se crea una referencia a este componente para que JS pueda invocar SetToken
            dotNetRef = DotNetObjectReference.Create(this);
            await JSRuntime.InvokeVoidAsync("registerTokenReceiver", dotNetRef);
        }
    }

    protected override void OnInitialized()
    {
        LimpiarEstadoUsuario();
    }

    private void LimpiarEstadoUsuario()
    {
        UserState.Token = "";
        UserState.NombreUsu = "";
        HttpContextAccessor?.HttpContext?.Session?.Clear();
    }

    public async Task LogIn()
    {
        mostrar = true;
        await Task.Delay(1);
        if (string.IsNullOrWhiteSpace(Usu) || string.IsNullOrWhiteSpace(pass))
        {
            mostrar = false;
            mensaje = "Por favor, ingrese su usuario y contraseña.";
            return;
        }
        try
        {
            var client = HttpClientFactory.CreateClient();
            client.BaseAddress = new Uri(Utilidades.urlSwagger());
            var loginPayload = new { NombreUsuario = Usu, Contraseña = pass, Origen = "Registro" };
            var loginContent = new StringContent(JsonConvert.SerializeObject(loginPayload), Encoding.UTF8, "application/json");
            var loginResponse = await client.PostAsync("Auth/login", loginContent);
            await ProcesarRespuesta(loginResponse);
        }
        catch (Exception ex)
        {
            mostrar = false;
            mensaje = $"Error inesperado: {ex.Message}";
        }
    }

    private async Task IniciarSesionConCertificado()
    {
        mostrar = true;

        var url = Utilidades.urlSwagger() + "Auth/login-cert?iframe=true";
        await JSRuntime.InvokeVoidAsync("iniciarSesionConCertificado", url);

    }

    private async Task ProcesarRespuesta(HttpResponseMessage response)
    {
        var responseContent = await response.Content.ReadAsStringAsync();
        if (response.IsSuccessStatusCode)
        {
            var parsedJson = JObject.Parse(responseContent);
            UserState.Token = parsedJson["token"]?.ToString() ?? "";
            // Actualizamos el nombre del usuario (formateado como "APELLIDOS, NOMBRE")
            UserState.NombreUsu = $"{parsedJson["user"]?["apellidos"]?.ToString()}, {parsedJson["user"]?["nombre"]?.ToString()}";
            Navigation.NavigateTo("/Trabajadores", true);
        }
        else
        {
            mostrar = false;
            mensaje = "Error de autenticación. Verifique sus credenciales o el certificado.";
        }
    }

    [JSInvokable]
    public Task SetToken(string token, string userJson)
    {
        // Actualizamos el token en UserState
        UserState.Token = token;
        try
        {
            var userObj = JObject.Parse(userJson);

            UserState.NombreUsu = $"{userObj["APELLIDOS"]?.ToString()}, {userObj["NOMBRE"]?.ToString()}";
        }
        catch
        {
            UserState.NombreUsu = "";
        }
        Navigation.NavigateTo("/Trabajadores", true);
        return Task.CompletedTask;
    }
}

<!-- Bloque de script inline para definir funciones de autenticación -->
<script>
    function registerTokenReceiver(dotnetRef) {
        window.dotnetTokenReceiver = dotnetRef;
    }

    window.iniciarSesionConCertificado = function (url) {
        console.log("Se llamó iniciarSesionConCertificado con URL:", url);
        var iframe = document.getElementById("authCertIframe");
        if (iframe) {
            iframe.src = url;
        } else {
            console.error("No se encontró el iframe con id 'authCertIframe'");
        }
    };

    window.addEventListener("message", function (event) {
        var data = event.data;
        if (data && data.token) {
            console.log("Mensaje recibido con token:", data.token);
            if (window.dotnetTokenReceiver) {
                window.dotnetTokenReceiver.invokeMethodAsync("SetToken", data.token, JSON.stringify(data.user));
            } else {
                localStorage.setItem("token", data.token);
                localStorage.setItem("user", JSON.stringify(data.user));
                window.location.href = "/cumplimientoTrienios";

            }
        }
    });
</script>
