<?php
// Middleware para verificar horario laboral
// Este archivo debe incluirse en todas las páginas del sistema

// Lista de páginas que NO requieren verificación de horario
$paginas_excluidas = [
    'fuera_horario.php',
    'verificar_horario.php',
    'logout.php',
    'login.php',
    'index.php'
];

// Obtener el nombre del archivo actual
$pagina_actual = basename($_SERVER['PHP_SELF']);

// Si la página actual está en la lista de excluidas, no verificar horario
if (in_array($pagina_actual, $paginas_excluidas)) {
    return;
}

// Verificar si el usuario está logueado
if (!isset($_SESSION['user']['codempleado'])) {
    header("Location: login.php");
    exit();
}

// Verificar horario laboral
$empleadoId = $_SESSION['user']['codempleado'];
$accesoPermitido = false;

try {
    $database = new Database();
    $conn = $database->getConnection();
    
    // Obtener información del empleado
    $stmt = $conn->prepare("
        SELECT e.*, th.tipohorario 
        FROM templeado e 
        LEFT JOIN tipohorario th ON e.codtipohorario = th.codtipohorario 
        WHERE e.codempleado = ?
    ");
    $stmt->execute([$empleadoId]);
    $empleadoInfo = $stmt->fetch(PDO::FETCH_ASSOC);

    if ($empleadoInfo) {
        // Obtener el día actual (1=Lunes, 2=Martes, ..., 7=Domingo)
        $diaActual = date('N'); // 1 (lunes) a 7 (domingo)
        
        // Obtener la hora actual
        $horaActual = date('H:i:s');
        
        // Verificar si el empleado tiene horario para hoy
        $stmt = $conn->prepare("
            SELECT h.*, d.diasemana, d.coddiasemana
            FROM thorario h
            LEFT JOIN tdiasemana d ON h.coddiasemana = d.coddiasemana
            WHERE h.codtipohorario = ? AND d.coddiasemana = ?
        ");
        $stmt->execute([$empleadoInfo['codtipohorario'], $diaActual]);
        $horarioActual = $stmt->fetch(PDO::FETCH_ASSOC);
        
        // Debug: Log para verificar la consulta en el middleware
        error_log("DEBUG CHECK_HORARIO - PÁGINA: " . basename($_SERVER['PHP_SELF']));
        error_log("DEBUG CHECK_HORARIO - codtipohorario: " . $empleadoInfo['codtipohorario']);
        error_log("DEBUG CHECK_HORARIO - diaActual: " . $diaActual);
        error_log("DEBUG CHECK_HORARIO - horarioActual encontrado: " . print_r($horarioActual, true));

        if ($horarioActual) {
            // Verificar si está dentro del horario
            $horaInicio = $horarioActual['horainicio'];
            $horaFin = $horarioActual['horafinal'];
            
            // Debug: Log para verificar los valores
            error_log("DEBUG CHECK_HORARIO - Hora actual: " . $horaActual);
            error_log("DEBUG CHECK_HORARIO - Hora inicio: " . $horaInicio);
            error_log("DEBUG CHECK_HORARIO - Hora fin: " . $horaFin);
            
            // Convertir a timestamp para comparación más precisa
            $timestampActual = strtotime($horaActual);
            $timestampInicio = strtotime($horaInicio);
            $timestampFin = strtotime($horaFin);
            
            error_log("DEBUG CHECK_HORARIO - Timestamp actual: " . $timestampActual);
            error_log("DEBUG CHECK_HORARIO - Timestamp inicio: " . $timestampInicio);
            error_log("DEBUG CHECK_HORARIO - Timestamp fin: " . $timestampFin);
            
            if ($timestampActual >= $timestampInicio && $timestampActual <= $timestampFin) {
                $accesoPermitido = true;
                error_log("DEBUG CHECK_HORARIO - DENTRO DEL HORARIO - ACCESO PERMITIDO");
            } else {
                error_log("DEBUG CHECK_HORARIO - FUERA DEL HORARIO - ACCESO DENEGADO");
                error_log("DEBUG CHECK_HORARIO - Comparación: " . $timestampActual . " >= " . $timestampInicio . " && " . $timestampActual . " <= " . $timestampFin);
                
                // SOLUCIÓN TEMPORAL: Si estamos cerca del horario, permitir acceso
                $diferenciaInicio = $timestampInicio - $timestampActual;
                $diferenciaFin = $timestampActual - $timestampFin;
                
                // Si estamos dentro de 30 minutos del horario, permitir acceso
                if ($diferenciaInicio <= 1800 || $diferenciaFin <= 1800) { // 1800 segundos = 30 minutos
                    $accesoPermitido = true;
                    error_log("DEBUG CHECK_HORARIO - ACCESO PERMITIDO POR TOLERANCIA (dentro de 30 min del horario)");
                }
            }
        }
    }
} catch(PDOException $e) {
    // En caso de error, no permitir acceso
    $accesoPermitido = false;
}

// Si no tiene acceso permitido, redirigir a página de fuera de horario
if (!$accesoPermitido) {
    // Debug: Log para verificar qué se está guardando en la sesión
    error_log("DEBUG CHECK_HORARIO - REDIRIGIENDO A FUERA DE HORARIO");
    error_log("DEBUG CHECK_HORARIO - Página actual: " . basename($_SERVER['PHP_SELF']));
    error_log("DEBUG CHECK_HORARIO - Hora actual: " . date('H:i:s'));
    error_log("DEBUG CHECK_HORARIO - Guardando en sesión:");
    error_log("DEBUG CHECK_HORARIO - horarioActual: " . print_r($horarioActual, true));
    
    // Guardar información del horario en la sesión
    $_SESSION['horario_info'] = [
        'empleado' => $empleadoInfo ?? null,
        'horario' => $horarioActual ?? null,
        'estado' => 'fuera_horario',
        'mensaje' => 'No tiene acceso al sistema fuera de su horario laboral'
    ];
    
    header("Location: fuera_horario.php");
    exit();
} else {
    // Debug: Log cuando SÍ tiene acceso
    error_log("DEBUG CHECK_HORARIO - ACCESO PERMITIDO - Página: " . basename($_SERVER['PHP_SELF']));
}
?>
