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

$alumno_id = $_GET['alumno_id'] ?? '';
$orden_campo = $_GET['orden_campo'] ?? 'fecha'; // Campo por el cual ordenar
$orden_direccion = $_GET['orden_direccion'] ?? 'DESC'; // ASC o DESC

// Filtros adicionales
$fecha_inicio = $_GET['fecha_inicio'] ?? '';
$fecha_fin = $_GET['fecha_fin'] ?? '';
$familiar_id_filtro = $_GET['familiar_id_filtro'] ?? '';

if (!$alumno_id) {
    echo json_encode([]);
    exit;
}

// Validar el campo de ordenamiento para evitar SQL injection
$campos_validos = ['fecha', 'motivo', 'funcionario', 'apoderado_nombre_completo'];
if (!in_array($orden_campo, $campos_validos)) {
    $orden_campo = 'fecha';
}

// Validar la dirección de ordenamiento
$orden_direccion = strtoupper($orden_direccion);
if (!in_array($orden_direccion, ['ASC', 'DESC'])) {
    $orden_direccion = 'DESC';
}

// Construir la cláusula ORDER BY dinámicamente
$orden_sql = '';
switch ($orden_campo) {
    case 'fecha':
        // Ordenar por fecha completa (fecha + hora) para mejor precisión
        $orden_sql = "e.fecha {$orden_direccion}, e.id {$orden_direccion}";
        break;
    case 'motivo':
        $orden_sql = "e.motivo {$orden_direccion}, e.fecha DESC";
        break;
    case 'funcionario':
        $orden_sql = "COALESCE(u.usuario, 'Usuario no encontrado') {$orden_direccion}, e.fecha DESC";
        break;
    case 'apoderado_nombre_completo':
        $orden_sql = "COALESCE(CONCAT_WS(' ', f.ap_paterno, f.ap_materno, ', ', f.nombre), 'Familiar no encontrado') {$orden_direccion}, e.fecha DESC";
        break;
    default:
        $orden_sql = "e.fecha DESC, e.id DESC";
}

try {
    $sql = "
        SELECT 
            e.id, 
            e.fecha, 
            e.motivo, 
            e.familiar_id,
            e.comunicacion,
            e.estado_envio_email,
            e.estado_envio_whatsapp,
            e.usuario_modificacion,
            e.fecha_modificacion,
            um.usuario AS usuario_modificacion_nombre,
            COALESCE(CONCAT_WS(' ', f.ap_paterno, f.ap_materno, ', ', f.nombre), 'Familiar no encontrado') AS apoderado_nombre_completo,
            COALESCE(u.usuario, 'Usuario no encontrado') AS funcionario
        FROM citaciones_apoderados e
        LEFT JOIN familiares f ON e.familiar_id = f.id
        LEFT JOIN usuarios u ON e.usuario_registro = u.id
        LEFT JOIN usuarios um ON e.usuario_modificacion = um.id
        WHERE e.alumno_id = :alumno_id
    ";

    $params = [':alumno_id' => [PDO::PARAM_INT, $alumno_id]];

    if (!empty($fecha_inicio)) {
        $sql .= " AND DATE(e.fecha) >= :fecha_inicio";
        $params[':fecha_inicio'] = [PDO::PARAM_STR, $fecha_inicio];
    }
    if (!empty($fecha_fin)) {
        $sql .= " AND DATE(e.fecha) <= :fecha_fin";
        $params[':fecha_fin'] = [PDO::PARAM_STR, $fecha_fin];
    }
    if (!empty($familiar_id_filtro)) {
        $sql .= " AND e.familiar_id = :familiar_id_filtro";
        $params[':familiar_id_filtro'] = [PDO::PARAM_INT, $familiar_id_filtro];
    }

    $sql .= " ORDER BY {$orden_sql}";

    $stmt = $pdo->prepare($sql);
    foreach ($params as $param => $val) {
        $stmt->bindValue($param, $val[1], $val[0]);
    }
    $stmt->execute();
    $citaciones = $stmt->fetchAll(PDO::FETCH_ASSOC);

    // Formatear fecha y hora por separado para el frontend
    if (is_array($citaciones)) {
        foreach ($citaciones as &$citacion) {
            // Asegurarse de que la fecha no sea nula o '0000-00-00...'
            if (!empty($citacion['fecha']) && $citacion['fecha'] !== '0000-00-00 00:00:00') {
                try {
                    $fecha_dt = new DateTime($citacion['fecha']);
                    $citacion['fecha_citacion'] = $fecha_dt->format('Y-m-d');
                    $citacion['hora_citacion'] = $fecha_dt->format('H:i');
                } catch (Exception $e) {
                    // Si la fecha es inválida, dejar los campos como nulos
                    $citacion['fecha_citacion'] = null;
                    $citacion['hora_citacion'] = null;
                }
            } else {
                $citacion['fecha_citacion'] = null;
                $citacion['hora_citacion'] = null;
            }
        }
    }

    echo json_encode($citaciones, JSON_INVALID_UTF8_SUBSTITUTE);
} catch (Throwable $e) {
    http_response_code(500);
    echo json_encode(['error' => 'Error en el servidor al listar citaciones: ' . $e->getMessage()], JSON_INVALID_UTF8_SUBSTITUTE);
}
