<?php
require_once "../functions.php";
$pag = basename($_SERVER['PHP_SELF']);

ini_set('session.use_strict_mode', '1');
ini_set('session.cookie_httponly', '1');
ini_set('session.cookie_secure', '1');
ini_set('session.cookie_samesite', 'Lax');

ini_set('session.gc_maxlifetime', APP_MAX_IDLE);
$cookie = session_get_cookie_params();
session_set_cookie_params([
    'lifetime' => APP_MAX_IDLE,
    'path' => $cookie['path'],
    'domain' => $cookie['domain'],
    'secure' => !empty($_SERVER['HTTPS']),
    'httponly' => true,
    'samesite' => 'Lax',
]);
session_start();


if (session_status() !== PHP_SESSION_ACTIVE)
    session_start();

if (SISTEMA_AUTOINICIO_SESION && isset($_GET['autoinicio']) && md5(filter_input(INPUT_GET, 'autoinicio', FILTER_SANITIZE_SPECIAL_CHARS)) == CLAVE_AUTONICIO) {

    if (!isset($_GET['id_usuario'])) {
        crear_log(
            "Info",
            "Inicio de sesión automático",
            $pag,
            "Se ha iniciado la sesión de forma automática con el usuario administrador."
        );
        session_regenerate_id(true);
        $datos = consulta("SELECT id,usuario,tipo FROM usuarios WHERE tipo='admin' ORDER BY id LIMIT 1", [], true)[0];
        $_SESSION["id_usuario"] = $datos["id"];
        $_SESSION["usuario"] = $datos['usuario'];
        $_SESSION["tipo_usuario"] = $datos["tipo"];
        $_SESSION["es_autoinicio"] = true;
        $_SESSION['last_activity'] = time();
        header("Location:" . SITIO_CARPETA . "/views/tables/fichajes");
    } else {
        $id = filter_input(INPUT_GET, "id_usuario", FILTER_SANITIZE_NUMBER_INT);
        crear_log(
            "Info",
            "Inicio de sesión automático",
            $pag,
            "Se ha iniciado la sesión de forma automática con el usuario con id " . $id . '.'
        );
        session_regenerate_id(true);
        $datos = consulta("SELECT id,usuario,tipo FROM usuarios WHERE id=?", [$id], true)[0];
        $_SESSION["id_usuario"] = $datos["id"];
        $_SESSION["usuario"] = $datos['usuario'];
        $_SESSION["tipo_usuario"] = $datos["tipo"];
        $_SESSION["es_autoinicio"] = true;
        $_SESSION['last_activity'] = time();
        $resultados = consulta("SELECT id_empleado FROM usuarios WHERE id=?", [$id], true)[0];
        $_SESSION["id_empleado"] = $resultados["id_empleado"];
        header("Location:" . SITIO_CARPETA . "/views/tables/fichajes");
    }
    exit;
}

$usuario = filter_input(INPUT_POST, "nombre", FILTER_SANITIZE_SPECIAL_CHARS);
$pass = md5(filter_input(INPUT_POST, "password", FILTER_SANITIZE_SPECIAL_CHARS));

/*******************************************************************************
 *                                  [reCAPTCHA]                                *
 *******************************************************************************/
$projectId = RECAPTCHA_PROYECTO;
$apiKey = RECAPTCHA_API_KEY;
$siteKey = RECAPTCHA_CLAVE;

$token = $_POST['recaptcha_token'] ?? '';
$expectedAction = $_POST['recaptcha_action'] ?? RECAPTCHA_ACTION_LOGIN;
$threshold = RECAPTCHA_SCORE_LOGIN;

if (!$token) {
    crear_log("advertencia", "Error reCaptcha", $pag, "Token ausente");
    header("Location: " . SITIO_CARPETA . "/iniciar_sesion?tipo=error&mensaje=Falta el token de reCAPTCHA");
    exit;
}

$url = "https://recaptchaenterprise.googleapis.com/v1/projects/{$projectId}/assessments?key=" . urlencode($apiKey);

$payload = [
    'event' => [
        'token' => $token,
        'expectedAction' => $expectedAction,
        'siteKey' => $siteKey,
    ],
];

$ch = curl_init($url);
curl_setopt_array($ch, [
    CURLOPT_POST => true,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER => ['Content-Type: application/json', 'Accept: application/json'],
    CURLOPT_POSTFIELDS => json_encode($payload),
    CURLOPT_TIMEOUT => 8,
    CURLOPT_CONNECTTIMEOUT => 5,
    CURLOPT_IPRESOLVE => CURL_IPRESOLVE_V4, // por si IPv6 está roto en el hosting
]);
$response = curl_exec($ch);
$errno = curl_errno($ch);
$error = curl_error($ch);
$http = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);

if ($response === false) {
    crear_log("advertencia", "Error reCaptcha", $pag, "cURL $errno: $error");
    header("Location: " . SITIO_CARPETA . "/iniciar_sesion?tipo=error&mensaje=No se pudo contactar con reCAPTCHA");
    exit;
}

$r = json_decode($response, true);
if ($http !== 200 || !is_array($r)) {
    crear_log("advertencia", "Error reCaptcha", $pag, "HTTP $http Body: $response");
    header("Location: " . SITIO_CARPETA . "/iniciar_sesion?tipo=error&mensaje=Error al validar reCAPTCHA");
    exit;
}

$valid = $r['tokenProperties']['valid'] ?? false;
$actionToken = $r['tokenProperties']['action'] ?? '';
$score = $r['riskAnalysis']['score'] ?? 0.0;

if (!($valid && $actionToken === $expectedAction && $score >= $threshold)) {
    $razones = implode(',', $r['riskAnalysis']['reasons'] ?? []);
    $inv = $r['tokenProperties']['invalidReason'] ?? '';
    crear_log("advertencia", "Error reCaptcha", $pag, "valid=$valid action=$actionToken score=$score reasons=$razones invalid=$inv");
    header("Location: " . SITIO_CARPETA . "/iniciar_sesion?tipo=error&mensaje=Verificación reCAPTCHA no superada");
    exit;
}

if (empty($resultados = consulta("SELECT id,tipo,id_empleado FROM usuarios WHERE usuario=? AND contra=?", [$usuario, $pass], true))) {
    $_SESSION["errorpass"] = $usuario;
    crear_log(
        "advertencia",
        "Intento de acceso",
        $pag,
        "Se ha intentado acceder a está página con un usuario o contraseña incorrecta."
    );
    header("Location: " . SITIO_CARPETA . "/iniciar_sesion?tipo=error&mensaje=El usuario y/o la contraseña es/son incorrecto/a/os");
} else {
    session_regenerate_id(true);
    $_SESSION["usuario"] = $usuario;
    $_SESSION["tipo_usuario"] = $resultados[0]["tipo"];
    $_SESSION["id_usuario"] = $resultados[0]["id"];
    $_SESSION["id_empleado"] = $resultados[0]["id_empleado"];
    $_SESSION['last_activity'] = time();
    $pantalla_bienvenida = get_config('pantalla_bienvenida') && $resultados[0]["tipo"] == 'admin' ? '?bienvenida=true' : '';
    crear_log(
        "info",
        "Sesión iniciada",
        $pag,
        "<b>[$usuario]</b> ha iniciado sesión."
    );
    header("Location:" . SITIO_CARPETA . "/views/tables/fichajes" . $pantalla_bienvenida);
}
