<?php
/**
 * @intranet-file common/app_guard_api.php
 * @intranet-file-version 2026.03.13.1
 * @intranet-file-date 2026-03-13
 * @intranet-file-owner CSIF Intranet
 */
// Variante del guardian para endpoints API (JSON).

if (session_status() === PHP_SESSION_NONE) {
    ini_set('session.gc_maxlifetime', '3600');
    session_start();
}

require_once __DIR__ . '/db.php';
require_once __DIR__ . '/catalogo_db.php';
require_once __DIR__ . '/user_preferences.php';

function api_json_out(int $status, array $payload): void {
    http_response_code($status);
    header('Content-Type: application/json; charset=utf-8');
    echo json_encode($payload);
    exit();
}

function checkAppAccessApi(): bool {
    if (isset($_SESSION['username']) && !intranet_enforce_session_timeout()) {
        api_json_out(401, ['ok' => false, 'error' => 'Sesion caducada por inactividad.']);
    }

    if (!isset($_SESSION['username'])) {
        api_json_out(401, ['ok' => false, 'error' => 'Sesion no valida.']);
    }

    try {
        $pdo = db();
        $app = catalogo_app_find_by_script($pdo, $_SERVER['PHP_SELF'] ?? '');
    } catch (Throwable $e) {
        error_log('app_guard_api: no se pudo cargar la aplicacion: ' . $e->getMessage());
        api_json_out(500, ['ok' => false, 'error' => 'Error critico: no se pudo cargar el catalogo de aplicaciones.']);
    }

    $found = is_array($app);
    $requiredRoles = $found ? catalogo_roles_from_json($app['roles_json'] ?? '') : [];
    $appName = $found ? (string)($app['name'] ?? 'Aplicacion') : 'Aplicacion';

    if (!$found) {
        api_json_out(403, ['ok' => false, 'error' => 'Aplicacion no registrada en el sistema de seguridad.']);
    }

    $userRoles = $_SESSION['roles'] ?? [];
    $userRoles = array_map('strtolower', is_array($userRoles) ? $userRoles : []);

    if (!catalogo_roles_allow($userRoles, $requiredRoles)) {
        api_json_out(403, ['ok' => false, 'error' => 'No tienes permisos para acceder a ' . $appName . '.']);
    }

    return true;
}

?>
