<?php
// auth_guard.php

require_once(__DIR__ . '/vendor/autoload.php');

use Firebase\JWT\JWT;
use Firebase\JWT\Key;

/**
 * Obtiene el token Bearer desde Authorization header
 */
function getBearerToken(): ?string {
    $auth = null;

    // Apache
    if (function_exists('getallheaders')) {
        $headers = getallheaders();
        $auth = $headers['Authorization'] ?? $headers['authorization'] ?? null;
    }

    // Nginx / FastCGI
    if (!$auth) {
        $auth = $_SERVER['HTTP_AUTHORIZATION'] ?? $_SERVER['REDIRECT_HTTP_AUTHORIZATION'] ?? null;
    }

    if (!$auth) return null;

    if (preg_match('/Bearer\s+(\S+)/', $auth, $m)) {
        return $m[1];
    }
    return null;
}

/**
 * Valida JWT y devuelve el payload como array.
 * Si falla: responde 401 y termina.
 */
function requireAuth(string $jwt_key): array {
    $token = getBearerToken();

    if (!$token) {
        http_response_code(401);
        echo json_encode(["success" => false, "message" => "Token requerido (Authorization: Bearer ...)"]);
        exit;
    }

    try {
        $decoded = JWT::decode($token, new Key($jwt_key, 'HS256'));
        return (array)$decoded;
    } catch (Exception $e) {
        http_response_code(401);
        echo json_encode(["success" => false, "message" => "Token inválido o expirado"]);
        exit;
    }
}

/**
 * Extra: valida que el usuario exista y esté activo (ESTADO_USUARIO=1)
 * Devuelve el registro del usuario (mínimo) si todo ok.
 */
function requireActiveUser(mysqli $mysqli, array $authUser): array {
    $userId = isset($authUser["userId"]) ? (int)$authUser["userId"] : 0;

    if ($userId <= 0) {
        http_response_code(401);
        echo json_encode(["success" => false, "message" => "Token sin userId válido"]);
        exit;
    }

    $sql = "SELECT ID_USUARIO, NOMBRE_USUARIO, APELLIDO_USUARIO, TIPO_USUARIO, ESTADO_USUARIO, CORREO_USUARIO
            FROM USUARIOS_SISTEMA
            WHERE ID_USUARIO = ?
            LIMIT 1";
    $stmt = $mysqli->prepare($sql);
    $stmt->bind_param("i", $userId);
    $stmt->execute();
    $r = $stmt->get_result()->fetch_assoc();

    if (!$r) {
        http_response_code(401);
        echo json_encode(["success" => false, "message" => "Usuario no existe"]);
        exit;
    }

    // En tu tabla: ESTADO_USUARIO referencia a ESTADO.ID_ESTADO, normalmente 1=activo
    if ((int)$r["ESTADO_USUARIO"] !== 1) {
        http_response_code(401);
        echo json_encode(["success" => false, "message" => "Usuario inactivo"]);
        exit;
    }

    return $r;
}
