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

error_reporting(0);
ini_set('display_errors', 0);

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

$response = [
  'success' => false,
  'message' => '',
  'totales' => [
    'asignados' => 0,
    'pendientes' => 0,
    'en_proceso' => 0,
    'rechazados' => 0,
    'contratados' => 0,
    'en_banco' => 0
  ],
  'recientes' => []
];

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);
}
$fecha_inicio = $_GET['inicio'] ?? null;
$fecha_fin = $_GET['fin'] ?? null;
$IncluirAnteriores = isset($_GET['incAnt']) ? (bool)$_GET['incAnt'] : false;


// ASIGNADOS totales
$condAsignados = '';
$paramsAsignados = [];
$tiposAsignados = '';
if ($fecha_inicio && $fecha_fin) {
  $condAsignados = "AND DATE(fecha_registro) BETWEEN ? AND ?";
  $paramsAsignados = [$attuid, $fecha_inicio, $fecha_fin];
  $tiposAsignados = 'sss';
} else {
  $paramsAsignados = [$attuid];
  $tiposAsignados = 's';
}

$sqlAsignados = "
  SELECT COUNT(*) AS total
  FROM aspirantes
  WHERE attuid = ?
  $condAsignados
";

$stmt1 = $conn->prepare($sqlAsignados);
if (!$stmt1) throw new Exception("Error en prepare (stmt1): " . $conn->error);
if (!empty($paramsAsignados)) {
$stmt1->bind_param($tiposAsignados, ...$paramsAsignados);
}
$stmt1->execute();
$result1 = $stmt1->get_result()->fetch_assoc();
$response['totales']['asignados'] = (int)($result1['total'] ?? 0);


// PENDIENTES POR REVISAR
$condPendSubquery = '';
$condPendWhere = '';
$condPendAcum = '';
$condPendBanco = '';
$paramsPend = [];
$tiposPend = '';
if ($fecha_fin) {

  if (!$IncluirAnteriores) {
    $condPendSubquery = "WHERE DATE(fecha) <= ?";
    $condPendWhere = "AND DATE(a.fecha_registro) <= ?";
    $condPendAcum = "AND DATE(a.fecha_registro) >= ?";
    $condPendBanco = "AND DATE(fecha_ingreso) <= ?";
    $paramsPend = [$fecha_fin, $fecha_fin, $fecha_inicio, $attuid, $fecha_fin];
    $tiposPend = 'sssss';
  }else{
    $condPendSubquery = "WHERE DATE(fecha) <= ?";
    $condPendWhere = "AND DATE(a.fecha_registro) <= ?";
    $condPendBanco = "AND DATE(fecha_ingreso) <= ?";
    $paramsPend = [$fecha_fin, $fecha_fin, $attuid, $fecha_fin];
    $tiposPend = 'ssss';

  }
} else {
  $paramsPend = [$attuid];
  $tiposPend = 's';
}

$sqlPend = "
SELECT COUNT(*) AS total
FROM aspirantes a
LEFT JOIN (
    SELECT s1.aspirante_id, s1.estatus, s1.fecha
    FROM seguimiento_estatus s1
    INNER JOIN (
        SELECT MAX(id) as max_id
        FROM seguimiento_estatus
        $condPendSubquery
        GROUP BY aspirante_id
    ) s2 ON s1.id = s2.max_id
) s ON a.id = s.aspirante_id
WHERE COALESCE(s.estatus, 'asignado') = 'asignado'
$condPendWhere
$condPendAcum
AND a.attuid = ?
AND a.id NOT IN (
    SELECT aspirante_id FROM banco_registros WHERE estatus = 'pendiente'
    $condPendBanco
)
";

$stmt1 = $conn->prepare($sqlPend);
if (!$stmt1) throw new Exception("Error en prepare (stmt1): " . $conn->error);
if (!empty($paramsPend)) {
$stmt1->bind_param($tiposPend, ...$paramsPend);
}
$stmt1->execute();
$result1 = $stmt1->get_result()->fetch_assoc();
$response['totales']['pendientes'] = (int)($result1['total'] ?? 0);




// EN PROCESO
$condProcesoSubquery = '';
$condProcesoWhere = '';
$condProcesoAcum = '';
$condProcesoBanco = '';
$paramsProceso = [];
$tiposProceso = '';
if ($fecha_fin) {
  if (!$IncluirAnteriores) {
    $condProcesoSubquery = "WHERE DATE(fecha) <= ?";
    $condProcesoWhere = "AND DATE(a.fecha_registro) <= ?";
    $condProcesoAcum = "AND DATE(a.fecha_registro) >= ?";
    $condProcesoBanco = "AND DATE(fecha_ingreso) <= ?";
    $paramsProceso = [$fecha_fin, $fecha_fin, $fecha_inicio, $attuid, $fecha_fin];
    $tiposProceso = 'sssss';
  }else {
    $condProcesoSubquery = "WHERE DATE(fecha) <= ?";
    $condProcesoWhere = "AND DATE(a.fecha_registro) <= ?";
    $condProcesoBanco = "AND DATE(fecha_ingreso) <= ?";
    $paramsProceso = [$fecha_fin, $fecha_fin, $attuid, $fecha_fin];
    $tiposProceso = 'ssss';
  }
} else {
  $paramsProceso = [$attuid];
  $tiposProceso = 's';
}

$sqlProceso = "
SELECT COUNT(*) AS total
FROM aspirantes a
LEFT JOIN (
    SELECT s1.aspirante_id, s1.estatus, s1.fecha
    FROM seguimiento_estatus s1
    INNER JOIN (
        SELECT MAX(id) as max_id
        FROM seguimiento_estatus
        $condProcesoSubquery
        GROUP BY aspirante_id
    ) s2 ON s1.id = s2.max_id
) s ON a.id = s.aspirante_id
WHERE COALESCE(s.estatus, 'asignado') NOT IN (
    'asignado','rechazado', 'contratado', 'en_pre_alta', 'en_plantilla', 'proceso_concluido'
)
$condProcesoWhere
$condProcesoAcum
AND a.attuid = ?
AND a.id NOT IN (
    SELECT aspirante_id FROM banco_registros WHERE estatus = 'pendiente'
    $condProcesoBanco
)
";

$stmt1 = $conn->prepare($sqlProceso);
if (!$stmt1) throw new Exception("Error en prepare (stmt1): " . $conn->error);
if (!empty($paramsProceso)) {
$stmt1->bind_param($tiposProceso, ...$paramsProceso);
}
$stmt1->execute();
$result1 = $stmt1->get_result()->fetch_assoc();
$response['totales']['en_proceso'] = (int)($result1['total'] ?? 0);


// RECHAZADOS
$condRech = '';
$condRechAcum = '';
$paramsRech = [];
$tiposRech = '';
if ($fecha_inicio && $fecha_fin) {
    if(!$IncluirAnteriores) {
      $condRech = "AND DATE(se.ultima_fecha) BETWEEN ? AND ?";
      $condRechAcum = "AND DATE(a.fecha_registro) >= ?";
      $paramsRech = [$fecha_inicio, $fecha_fin, $fecha_inicio, $attuid];
      $tiposRech = 'ssss';
    } else {
      $condRech = "AND DATE(se.ultima_fecha) BETWEEN ? AND ?";
      $paramsRech = [$fecha_inicio, $fecha_fin, $attuid];
      $tiposRech = 'sss';
    }
} else {
    $paramsRech = [$attuid];
    $tiposRech = 's';
}

$sqlRech = "
  SELECT COUNT(*) AS total
  FROM aspirantes a
  INNER JOIN (
    SELECT aspirante_id, MAX(fecha) AS ultima_fecha
    FROM seguimiento_estatus
    GROUP BY aspirante_id
  ) AS se ON se.aspirante_id = a.id
  WHERE a.estatus_actual = 'rechazado'
  $condRech
  $condRechAcum
  AND a.attuid = ?
";
$stmt2 = $conn->prepare($sqlRech);
if (!$stmt2) throw new Exception("Error en prepare (stmt2): " . $conn->error);
if (!empty($paramsRech)) {
  $stmt2->bind_param($tiposRech, ...$paramsRech);
}
$stmt2->execute();
$result2 = $stmt2->get_result()->fetch_assoc();
$response['totales']['rechazados'] = (int)($result2['total'] ?? 0);


// CONTRATADOS
$condCont = '';
$condContAcum = '';
$paramsCont = [];
$tiposCont = '';
if ($fecha_inicio && $fecha_fin) {
  if (!$IncluirAnteriores) {
    $condCont = "AND DATE(se.fecha_contrato) BETWEEN ? AND ?";
    $condContAcum = "AND DATE(a.fecha_registro) >= ?";
    $paramsCont = [ $attuid, $fecha_inicio, $fecha_fin, $fecha_inicio];
    $tiposCont = 'ssss';
  } else {
    $condCont = "AND DATE(se.fecha_contrato) BETWEEN ? AND ?";
    $paramsCont = [ $attuid, $fecha_inicio, $fecha_fin];
    $tiposCont = 'sss'; 
  }
} else {
    $paramsCont = [$attuid];
    $tiposCont = 's';
}

$sqlContratados = "
  SELECT COUNT(*) AS total FROM aspirantes a
  INNER JOIN (
      SELECT aspirante_id, (MIN(fecha)) AS fecha_contrato, estatus
      FROM seguimiento_estatus
      WHERE estatus IN ('contratado', 'en_pre_alta', 'en_plantilla', 'proceso_concluido')
      GROUP BY aspirante_id
  ) AS se ON se.aspirante_id = a.id
  WHERE a.attuid = ?
  $condCont
  $condContAcum
";


$stmt3 = $conn->prepare($sqlContratados);
if (!$stmt3) throw new Exception("Error en prepare (stmt3): " . $conn->error);
if (!empty($paramsCont)) {
  $stmt3->bind_param($tiposCont, ...$paramsCont);
}
$stmt3->execute();
$result3 = $stmt3->get_result()->fetch_assoc();
$response['totales']['contratados'] = (int)($result3['total'] ?? 0);

//EN EL BANCO DE REGISTROS
$condBanco = '';
$condBancoAcum = '';
$paramsBanco = [];
$tiposBanco = '';

if ($fecha_inicio && $fecha_fin) {
  if(!$IncluirAnteriores) {
    $condBanco = "AND b.fecha_ingreso BETWEEN ? AND ?";
    $condBancoAcum = "AND DATE(a.fecha_registro) >= ?";
    $paramsBanco = [$fecha_inicio, $fecha_fin, $fecha_inicio, $attuid];
    $tiposBanco = 'ssss';
  } else {
    $condBanco = "AND b.fecha_ingreso BETWEEN ? AND ?";
    $paramsBanco = [$fecha_inicio, $fecha_fin, $attuid];
    $tiposBanco = 'sss';
  }
} else {
  $paramsBanco = [$attuid];
  $tiposBanco = 's';
}

$sqlBanco = "
  SELECT COUNT(*) AS total
  FROM banco_registros b LEFT JOIN aspirantes a ON a.id = b.aspirante_id
  WHERE b.estatus = 'pendiente'
  $condBanco
  $condBancoAcum
  AND b.activado_por = ?
";

$stmt4 = $conn->prepare($sqlBanco);
if (!$stmt4) throw new Exception("Error en prepare (stmt4): " . $conn->error);
if (!empty($paramsBanco)) {
  $stmt4->bind_param($tiposBanco, ...$paramsBanco);
}
$stmt4->execute();
$result4 = $stmt4->get_result()->fetch_assoc();
$response['totales']['en_banco'] = (int)($result4['total'] ?? 0);


//Actividad reciente
$paramsRecientes = [$attuid];
$tiposRecientes = 's';


$sqlRecientes = "
SELECT 
    a.id,
    a.nombre,
    a.apellido_paterno,
    a.apellido_materno,
    a.puesto,
    se.estatus,
    se.id AS max_seguimiento_id,
    se.fecha
FROM aspirantes a
LEFT JOIN (
    SELECT *
    FROM seguimiento_estatus se1
    WHERE se1.id = (
        SELECT MAX(se2.id)
        FROM seguimiento_estatus se2
        WHERE se2.aspirante_id = se1.aspirante_id
    )
    AND se1.usuario = ?
) se ON a.id = se.aspirante_id
ORDER BY se.fecha DESC
LIMIT 5;
";

$stmt = $conn->prepare($sqlRecientes);
if (!$stmt) throw new Exception("Error en prepare (stmt): " . $conn->error);
if (!empty($paramsRecientes)) {
  $stmt->bind_param($tiposRecientes, ...$paramsRecientes);
}
$stmt->execute();
$result = $stmt->get_result();

$recientes = [];
while ($row = $result->fetch_assoc()) {
  $nombre_completo = $row['nombre'] . ' ' . $row['apellido_paterno'] . ' ' . $row['apellido_materno'];
  $estatus = strtolower(trim($row['estatus']));
  $recientes[] = [
    'id' => $row['id'],
    'nombre_completo' => $nombre_completo,
    'puesto' => $row['puesto'],
    'estado' => ucfirst($estatus),
    'ultima_modificacion' => $row['fecha'] ?? null
  ];
}
$response['recientes'] = $recientes;

$response['success'] = true;
$response['message'] = 'Datos obtenidos correctamente';
echo json_encode($response);
?>