<?php
// concurso_nobel/includes/seguridad.php

declare(strict_types=1);

require_once __DIR__ . '/config.php';

if (!function_exists('cn_redirigir')) {
    function cn_redirigir(string $url): void
    {
        header('Location: ' . $url);
        exit;
    }
}

if (!function_exists('cn_tabla_existe')) {
    function cn_tabla_existe(mysqli $conn, string $tabla): bool
    {
        $tabla = mysqli_real_escape_string($conn, $tabla);
        $res = @mysqli_query($conn, "SHOW TABLES LIKE '{$tabla}'");
        return $res && mysqli_num_rows($res) > 0;
    }
}

if (!function_exists('cn_auditar')) {
    require_once __DIR__ . '/auditoria.php';
}

if (!function_exists('cn_limpiar_sesion_concurso')) {
    function cn_limpiar_sesion_concurso(): void
    {
        unset(
            $_SESSION['cn_acceso_id'],
            $_SESSION['cn_concurso_id'],
            $_SESSION['cn_grupo_id'],
            $_SESSION['cn_salon_id'],
            $_SESSION['cn_codigo'],
            $_SESSION['cn_responsable'],
            $_SESSION['cn_last_activity']
        );
    }
}

if (!function_exists('cn_acceso_actual')) {
    function cn_acceso_actual(mysqli $conn): ?array
    {
        $idAcceso = (int)($_SESSION['cn_acceso_id'] ?? 0);
        $idConcurso = (int)($_SESSION['cn_concurso_id'] ?? 0);

        if ($idAcceso <= 0 || $idConcurso <= 0) {
            return null;
        }

        $ultimaActividad = (int)($_SESSION['cn_last_activity'] ?? 0);

        if ($ultimaActividad > 0 && (time() - $ultimaActividad) > CN_SESSION_TIMEOUT) {
            cn_auditar($conn, $idConcurso, null, $idAcceso, null, 'SESION_EXPIRADA', 'Sesión expirada por inactividad.');
            cn_limpiar_sesion_concurso();
            return null;
        }

        $stmt = mysqli_prepare($conn, "
            SELECT
                a.*,
                c.nombre AS concurso_nombre,
                c.subtitulo AS concurso_subtitulo,
                c.estado AS concurso_estado,
                c.fecha_inicio,
                c.fecha_fin,
                g.nombre AS grupo_nombre,
                g.nivel,
                g.grado_nombre,
                s.nombre_salon,
                s.codigo_salon
            FROM concurso_accesos a
            INNER JOIN concursos c ON c.id_concurso = a.id_concurso
            LEFT JOIN concurso_grupos g ON g.id_grupo = a.id_grupo
            LEFT JOIN concurso_salones s ON s.id_salon = a.id_salon
            WHERE a.id_acceso = ?
              AND a.id_concurso = ?
            LIMIT 1
        ");

        if (!$stmt) {
            return null;
        }

        mysqli_stmt_bind_param($stmt, 'ii', $idAcceso, $idConcurso);
        mysqli_stmt_execute($stmt);
        $res = mysqli_stmt_get_result($stmt);
        $acceso = mysqli_fetch_assoc($res);
        mysqli_stmt_close($stmt);

        if (!$acceso) {
            cn_limpiar_sesion_concurso();
            return null;
        }

        $hoy = date('Y-m-d');

        if ((int)$acceso['activo'] !== 1 || strtoupper((string)$acceso['concurso_estado']) !== 'ACTIVO') {
            cn_limpiar_sesion_concurso();
            return null;
        }

        if (!empty($acceso['fecha_inicio']) && $hoy < $acceso['fecha_inicio']) {
            cn_limpiar_sesion_concurso();
            return null;
        }

        if (!empty($acceso['fecha_fin']) && $hoy > $acceso['fecha_fin']) {
            cn_limpiar_sesion_concurso();
            return null;
        }

        if (!empty($acceso['fecha_expiracion']) && $hoy > $acceso['fecha_expiracion']) {
            cn_limpiar_sesion_concurso();
            return null;
        }

        $_SESSION['cn_last_activity'] = time();

        return $acceso;
    }
}

if (!function_exists('cn_requerir_acceso')) {
    function cn_requerir_acceso(mysqli $conn): array
    {
        $acceso = cn_acceso_actual($conn);

        if (!$acceso) {
            cn_redirigir('index.php');
        }

        return $acceso;
    }
}

if (!function_exists('cn_requerir_permiso')) {
    function cn_requerir_permiso(array $acceso, string $campoPermiso): void
    {
        if ((int)($acceso[$campoPermiso] ?? 0) !== 1) {
            http_response_code(403);
            die('Acceso denegado. Tu código no tiene permiso para esta acción.');
        }
    }
}
