<?php
if (session_status() === PHP_SESSION_NONE) {
    session_start();
}

// No mostrar errores en JSON para evitar romper la respuesta
error_reporting(0);
ini_set('display_errors', 0);

header('Content-Type: application/json');
require_once(__DIR__ . '/../db/conexion.php');

$response = ['success' => false, 'data' => [], 'stats' => [], 'historico' => []];

if (!isset($_SESSION['attuid'], $_SESSION['rol'])) {
    echo json_encode($response);
    exit;
}

$attuid = $_SESSION['attuid'];
$rol = $_SESSION['rol'];

function validarFecha($fecha) {
    return preg_match('/^\d{4}-\d{2}-\d{2}$/', $fecha);
}

// Fechas para filtro de stats
$inicio_get = $_GET['inicio'] ?? null;
$fin_get = $_GET['fin'] ?? null;
// Fechas para filtro de stats (siempre semana actual: lunes a domingo)
if (isset($inicio_get) && validarFecha($inicio_get) && isset($fin_get) && validarFecha($fin_get)) {
    $inicio_semana = $inicio_get;
    $fin_semana = $fin_get;
} else {
    // Calcular lunes y domingo de la semana actual
    $dia_semana = date('N'); // 1 (lunes) a 7 (domingo)
    $inicio_semana = date('Y-m-d', strtotime('monday this week'));
    $fin_semana = date('Y-m-d', strtotime('sunday this week'));
}

// =====================
// Últimos 5 asignados (NO afectados por filtro)
// =====================
$sql = "
SELECT 
    a.id,
    a.nombre,
    a.apellido_paterno,
    a.apellido_materno,
    a.puesto,
    a.estatus_actual,
    (
        SELECT MAX(se.fecha)
        FROM seguimiento_estatus se
        WHERE se.aspirante_id = a.id
    ) AS ultima_modificacion
FROM aspirantes a
WHERE a.estatus_actual = 'asignado'
ORDER BY a.fecha_registro DESC
LIMIT 5
";

$stmt = $conn->prepare($sql);
$stmt->execute();
$result = $stmt->get_result();

$candidatos = [];

while ($row = $result->fetch_assoc()) {
    $nombre_completo = $row['nombre'] . ' ' . $row['apellido_paterno'] . ' ' . $row['apellido_materno'];
    $estatus = strtolower(trim($row['estatus_actual']));

    $candidatos[] = [
        'id' => $row['id'],
        'nombre_completo' => $nombre_completo,
        'puesto' => $row['puesto'],
        'estado' => ucfirst($estatus),
        'ultima_modificacion' => $row['ultima_modificacion'] ?? null
    ];
}

// =====================
// Totales hist贸ricos (NO afectados por fechas) usando seguimiento_estatus y attuid del usuario logueado
// =====================
$sqlHist = "SELECT a.id, a.attuid, a.estatus_actual, se.ultimo_estatus, se.usuario_ultimo
FROM aspirantes a
INNER JOIN (
    SELECT se1.aspirante_id, se1.estatus AS ultimo_estatus, se1.usuario AS usuario_ultimo
    FROM seguimiento_estatus se1
    INNER JOIN (
        SELECT aspirante_id, MAX(fecha) AS max_fecha
        FROM seguimiento_estatus
        GROUP BY aspirante_id
    ) se2 ON se1.aspirante_id = se2.aspirante_id AND se1.fecha = se2.max_fecha
) se ON a.id = se.aspirante_id
WHERE se.usuario_ultimo = ? AND a.estatus_actual = se.ultimo_estatus";
$stmtHist = $conn->prepare($sqlHist);
$stmtHist->bind_param("s", $attuid);
$stmtHist->execute();
$resHist = $stmtHist->get_result();

$historico = [
    'asignados' => 0,
    'en_proceso' => 0,
    'contratados' => 0,
    'rechazados' => 0
];
while ($row = $resHist->fetch_assoc()) {
    // Inicialización interna, no imprimir ni hacer echo de $dataCards
    $estatus = strtolower(trim($row['ultimo_estatus']));
    if ($estatus === 'asignado') {
        $historico['asignados']++;
    } elseif (in_array($estatus, ['contratado', 'en_pre_alta', 'en_plantilla', 'proceso_concluido'])) {
        $historico['contratados']++;
    } elseif (strpos($estatus, 'rechazado') !== false) {
        $historico['rechazados']++;
    } else {
        $historico['en_proceso']++;
    }
}
$response['historico'] = $historico;

// =====================
// Totales filtrados por fecha (para tarjetas din谩micas) usando seguimiento_estatus, attuid y estatus_actual
// =====================
$sqlStats = "SELECT a.id, a.attuid, a.estatus_actual, se.ultimo_estatus, se.usuario_ultimo, se.fecha
FROM aspirantes a
INNER JOIN (
    SELECT se1.aspirante_id, se1.estatus AS ultimo_estatus, se1.usuario AS usuario_ultimo, se1.fecha
    FROM seguimiento_estatus se1
    INNER JOIN (
        SELECT aspirante_id, MAX(id) AS max_id
        FROM seguimiento_estatus
        WHERE DATE(fecha) BETWEEN ? AND ?
        GROUP BY aspirante_id
    ) se2 ON se1.aspirante_id = se2.aspirante_id AND se1.id = se2.max_id
) se ON a.id = se.aspirante_id
WHERE se.usuario_ultimo = ? AND a.estatus_actual = se.ultimo_estatus";
$paramsStats = [$inicio_semana, $fin_semana, $attuid];
$tiposStats = "sss";
$stmtStats = $conn->prepare($sqlStats);
$stmtStats->bind_param($tiposStats, ...$paramsStats);
$stmtStats->execute();
$resStats = $stmtStats->get_result();

$stats = [
    'asignados' => 0,
    'en_proceso' => 0,
    'contratados' => 0,
    'rechazados' => 0
];

// Inicializar variables que se usarán más adelante
$dataCards = [
    'asignados' => [],
    'en_proceso' => [],
    'contratados' => [],
    'rechazados' => []
];
$countedIds = [];

while ($row = $resStats->fetch_assoc()) {
    $estatus = $row['ultimo_estatus'] !== null ? strtolower(trim($row['ultimo_estatus'])) : '';
    $nombre_completo = '';
    $fecha_estatus = isset($row['fecha']) ? $row['fecha'] : null;
    if (isset($row['id'])) {
        // Obtener nombre completo del aspirante
        $sqlNombre = "SELECT nombre, apellido_paterno, apellido_materno FROM aspirantes WHERE id = ? LIMIT 1";
        $stmtNombre = $conn->prepare($sqlNombre);
        $stmtNombre->bind_param("i", $row['id']);
        $stmtNombre->execute();
        $resNombre = $stmtNombre->get_result();
        if ($resNombre && $resNombre->num_rows > 0) {
            $rowNombre = $resNombre->fetch_assoc();
            $nombre_completo = trim($rowNombre['nombre'] . ' ' . $rowNombre['apellido_paterno'] . ' ' . $rowNombre['apellido_materno']);
        }
        $stmtNombre->close();
    }
    $item = ['id' => $row['id'], 'nombre_completo' => $nombre_completo, 'fecha' => $fecha_estatus];
    if ($estatus === 'asignado') {
        $stats['asignados']++;
        $dataCards['asignados'][] = $item;
    } elseif (in_array($estatus, ['contratado', 'en_pre_alta', 'en_plantilla', 'proceso_concluido'])) {
        $stats['contratados']++;
        $dataCards['contratados'][] = $item;
    } elseif (strpos($estatus, 'rechazado') !== false) {
        $stats['rechazados']++;
        $dataCards['rechazados'][] = $item;
    } else {
        $stats['en_proceso']++;
        $dataCards['en_proceso'][] = $item;
    }
}

// Incluir aspirantes cuyo estatus_actual = 'asignado' en la tabla aspirantes
// si el último seguimiento hecho por este usuario cae dentro del rango y no fueron contados antes
$sqlAsignadosFromAspirantes = "SELECT a.id, a.nombre, a.apellido_paterno, a.apellido_materno,
    (SELECT MAX(se.fecha) FROM seguimiento_estatus se WHERE se.aspirante_id = a.id AND se.usuario = ?) AS last_by_user
    FROM aspirantes a
    WHERE a.attuid = ? AND a.estatus_actual = 'asignado'";
$stmtAsign = $conn->prepare($sqlAsignadosFromAspirantes);
$stmtAsign->bind_param("ss", $attuid, $attuid);
$stmtAsign->execute();
$resAsign = $stmtAsign->get_result();
while ($rowA = $resAsign->fetch_assoc()) {
    $aid = $rowA['id'];
    if (isset($countedIds[$aid])) {
        continue;
    }
    $lastByUser = $rowA['last_by_user'];
    if ($lastByUser && date('Y-m-d', strtotime($lastByUser)) >= $inicio_semana && date('Y-m-d', strtotime($lastByUser)) <= $fin_semana) {
        $nombre_completo = trim($rowA['nombre'] . ' ' . $rowA['apellido_paterno'] . ' ' . $rowA['apellido_materno']);
        $item = ['id' => $aid, 'nombre_completo' => $nombre_completo, 'fecha' => $lastByUser];
        $stats['asignados']++;
        $dataCards['asignados'][] = $item;
        $countedIds[$aid] = true;
    }
}
if (isset($stmtAsign)) $stmtAsign->close();

// También incluir aspirantes que fueron creados/registrados como 'asignado' en el rango (no siempre hay seguimiento)
$sqlAsignadosByRegistro = "SELECT a.id, a.nombre, a.apellido_paterno, a.apellido_materno, a.fecha_registro
    FROM aspirantes a
    WHERE a.attuid = ? AND a.estatus_actual = 'asignado' AND DATE(a.fecha_registro) BETWEEN ? AND ?";
$stmtAsignReg = $conn->prepare($sqlAsignadosByRegistro);
$stmtAsignReg->bind_param("sss", $attuid, $inicio_semana, $fin_semana);
$stmtAsignReg->execute();
$resAsignReg = $stmtAsignReg->get_result();
while ($rowR = $resAsignReg->fetch_assoc()) {
    $aid = $rowR['id'];
    if (isset($countedIds[$aid])) continue;
    $nombre_completo = trim($rowR['nombre'] . ' ' . $rowR['apellido_paterno'] . ' ' . $rowR['apellido_materno']);
    $item = ['id' => $aid, 'nombre_completo' => $nombre_completo, 'fecha' => $rowR['fecha_registro']];
    $stats['asignados']++;
    $dataCards['asignados'][] = $item;
    $countedIds[$aid] = true;
}
if (isset($stmtAsignReg)) $stmtAsignReg->close();

// =====================
// 🔚 Finalizar respuesta
// =====================
$response['success'] = true;
$response['data'] = $candidatos;
$response['stats'] = $stats;
$response['dataCards'] = $dataCards;

echo json_encode($response);
