<?php
header('Content-Type: application/json');
require_once __DIR__ . '/config/db_auto.php';
require_once __DIR__ . '/src/system_logger.php';

session_start();

// 1. Verificación de Autenticación y Permisos (REAL, no simulado)
if (!isset($_SESSION['user_id'])) {
    http_response_code(401);
    echo json_encode(['success' => false, 'error' => 'No autorizado. Por favor, inicie sesión.']);
    exit;
}

$rol = strtolower($_SESSION['rol'] ?? '');
if (!in_array($rol, ['administrador', 'convivencia'])) {
    http_response_code(403);
    echo json_encode(['success' => false, 'error' => 'Acceso denegado. Permisos insuficientes.']);
    exit;
}

$metodo = $_SERVER['REQUEST_METHOD'];
$pdo = getDbConnection(); // 2. Usar PDO para consistencia con el resto del proyecto

try {
    switch ($metodo) {
        case 'GET':
            if (!isset($_GET['alumno_id']) || !is_numeric($_GET['alumno_id'])) {
                throw new Exception("ID de alumno no proporcionado o no válido.");
            }
            $alumno_id = intval($_GET['alumno_id']);

            // 3. Query mejorada con CONCAT para nombre completo del entrevistador
            $stmt = $pdo->prepare("
                SELECT e.*, CONCAT(u.nombre, ' ', u.apellido) as nombre_entrevistador 
                FROM entrevistas_alumnos e
                LEFT JOIN usuarios u ON e.usuario_id = u.id
                WHERE e.alumno_id = ? 
                ORDER BY e.fecha_entrevista DESC
            ");
            $stmt->execute([$alumno_id]);
            $entrevistas = $stmt->fetchAll(PDO::FETCH_ASSOC);

            echo json_encode(['success' => true, 'data' => $entrevistas]);
            break;

        case 'POST':
            $data = json_decode(file_get_contents('php://input'), true);

            // Validación de datos
            if (empty($data['alumno_id']) || empty($data['fecha_entrevista']) || empty($data['tipo_entrevista']) || empty($data['motivo'])) {
                throw new Exception("Faltan campos obligatorios: Alumno, Fecha, Tipo y Motivo son requeridos.");
            }

            $alumno_id = intval($data['alumno_id']);
            $usuario_id = $_SESSION['user_id'];
            $fecha_entrevista = $data['fecha_entrevista'];
            $tipo_entrevista = filter_var($data['tipo_entrevista'], FILTER_SANITIZE_STRING);
            $motivo = filter_var($data['motivo'], FILTER_SANITIZE_STRING);
            $acuerdos = !empty($data['acuerdos_compromisos']) ? filter_var($data['acuerdos_compromisos'], FILTER_SANITIZE_STRING) : null;
            $observaciones = !empty($data['observaciones']) ? filter_var($data['observaciones'], FILTER_SANITIZE_STRING) : null;

            $stmt = $pdo->prepare("
                INSERT INTO entrevistas_alumnos (alumno_id, usuario_id, fecha_entrevista, tipo_entrevista, motivo, acuerdos, observaciones) 
                VALUES (?, ?, ?, ?, ?, ?, ?)
            ");

            if (!$stmt->execute([$alumno_id, $usuario_id, $fecha_entrevista, $tipo_entrevista, $motivo, $acuerdos, $observaciones])) {
                throw new Exception("Error al guardar la entrevista: " . implode(" - ", $stmt->errorInfo()));
            }

            $nuevo_id = $pdo->lastInsertId();

            // 4. Logging de la acción
            SystemLogger::getInstance()->logAction('create', "Usuario ID {$_SESSION['user_id']} creó entrevista de alumno. ID Entrevista: {$nuevo_id}, Alumno ID: {$alumno_id}");

            echo json_encode(['success' => true, 'message' => 'Entrevista guardada correctamente.', 'id' => $nuevo_id]);
            break;

        case 'PUT':
            $data = json_decode(file_get_contents('php://input'), true);

            if (empty($data['id']) || !is_numeric($data['id'])) {
                throw new Exception("ID de entrevista no proporcionado o no válido.");
            }

            $id = intval($data['id']);
            $fecha_entrevista = $data['fecha_entrevista'];
            $tipo_entrevista = filter_var($data['tipo_entrevista'], FILTER_SANITIZE_STRING);
            $motivo = filter_var($data['motivo'], FILTER_SANITIZE_STRING);
            $acuerdos = !empty($data['acuerdos_compromisos']) ? filter_var($data['acuerdos_compromisos'], FILTER_SANITIZE_STRING) : null;
            $observaciones = !empty($data['observaciones']) ? filter_var($data['observaciones'], FILTER_SANITIZE_STRING) : null;

            $stmt = $pdo->prepare("
                UPDATE entrevistas_alumnos 
                SET fecha_entrevista = ?, tipo_entrevista = ?, motivo = ?, acuerdos_compromisos = ?, observaciones = ?
                WHERE id = ?
            ");

            if (!$stmt->execute([$fecha_entrevista, $tipo_entrevista, $motivo, $acuerdos, $observaciones, $id])) {
                throw new Exception("Error al actualizar la entrevista: " . implode(" - ", $stmt->errorInfo()));
            }

            // 4. Logging de la acción
            SystemLogger::getInstance()->logAction('update', "Usuario ID {$_SESSION['user_id']} actualizó entrevista de alumno. ID Entrevista: {$id}");

            echo json_encode(['success' => true, 'message' => 'Entrevista actualizada correctamente.']);
            break;

        case 'DELETE':
            $data = json_decode(file_get_contents('php://input'), true);

            if (empty($data['id']) || !is_numeric($data['id'])) {
                throw new Exception("ID de entrevista no proporcionado o no válido.");
            }

            $id = intval($data['id']);

            $stmt = $pdo->prepare("DELETE FROM entrevistas_alumnos WHERE id = ?");

            if (!$stmt->execute([$id])) {
                throw new Exception("Error al eliminar la entrevista: " . implode(" - ", $stmt->errorInfo()));
            }

            if ($stmt->rowCount() > 0) {
                // 4. Logging de la acción
                SystemLogger::getInstance()->logAction('delete', "Usuario ID {$_SESSION['user_id']} eliminó entrevista de alumno. ID Entrevista: {$id}");
                echo json_encode(['success' => true, 'message' => 'Entrevista eliminada correctamente.']);
            } else {
                http_response_code(404);
                throw new Exception("No se encontró la entrevista para eliminar o ya fue eliminada.");
            }
            break;

        default:
            http_response_code(405);
            echo json_encode(['success' => false, 'error' => 'Método no permitido']);
            break;
    }
} catch (Exception $e) {
    // 5. Manejo de errores mejorado
    $httpCode = $e->getCode() >= 400 ? $e->getCode() : 400;
    http_response_code($httpCode);
    SystemLogger::getInstance()->logError("Error en gestion_entrevistas_alumno.php: " . $e->getMessage());
    echo json_encode(['success' => false, 'error' => $e->getMessage()]);
}
