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

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

ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);

try {
  if (!isset($_SESSION['rol']) || !in_array($_SESSION['rol'], ['admin', 'adminTi', 'coordinador'])) {
    throw new Exception("Acceso denegado");
  }

  // Recibir el JSON del body
  $input = json_decode(file_get_contents('php://input'), true);

  // Log de depuración
  error_log('[get_panel_admin.php] Input recibido: ' . print_r($input, true));

  $fecha_inicio = isset($input['inicio']) ? $input['inicio'] : '';
  $fecha_fin = isset($input['fin']) ? $input['fin'] : '';
  $reclutadores = isset($input['reclutadores']) ? $input['reclutadores'] : [];
  $incluirAnteriores = isset($input['incAnt']) ? (bool)$input['incAnt'] : false;

  // Log de depuración
  error_log('[get_panel_admin.php] Fecha inicio: ' . $fecha_inicio);
  error_log('[get_panel_admin.php] Fecha fin: ' . $fecha_fin);
  error_log('[get_panel_admin.php] Reclutadores: ' . print_r($reclutadores, true));
  error_log('[get_panel_admin.php] Incluir anteriores: ' . ($incluirAnteriores ? 'true' : 'false'));

  // Construir condición IN para reclutadores
  $placeholders = implode(',', array_fill(0, count($reclutadores), '?'));
  $condicionReclutadores = "AND a.attuid IN ($placeholders)";

  // 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, $fecha_fin];
      $tiposProceso = 'ssss';

    }else{
      $condProcesoSubquery = "WHERE DATE(fecha) <= ?";
      $condProcesoWhere = "AND DATE(a.fecha_registro) <= ?";
      $condProcesoBanco = "AND DATE(fecha_ingreso) <= ?";
      $paramsProceso = [$fecha_fin, $fecha_fin, $fecha_fin];
      $tiposProceso = 'sss';
    }
  }

  // Agregar reclutadores
  $paramsProceso = array_merge($paramsProceso, $reclutadores);
  $tiposProceso .= str_repeat('s', count($reclutadores));


  $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.id NOT IN (
        SELECT aspirante_id FROM banco_registros WHERE estatus = 'pendiente'
        $condProcesoBanco
    )
    $condicionReclutadores
  ";

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

  // RECHAZADOS
  $condRech = '';
  $condRechAcum = '';
  $paramsRech = [];
  $tiposRech = '';

  // Primero agregar reclutadores
  $paramsRech = $reclutadores;
  $tiposRech = str_repeat('s', count($reclutadores));

  if ($fecha_inicio && $fecha_fin) {
    if(!$incluirAnteriores){
      $condRech = "AND DATE(se.ultima_fecha) BETWEEN ? AND ?";
      $condRechAcum = "AND DATE(a.fecha_registro) >= ?";
      $paramsRech = array_merge($paramsRech, [$fecha_inicio, $fecha_fin, $fecha_inicio]);
      $tiposRech .= 'sss';
    }else{
      $condRech = "AND DATE(se.ultima_fecha) BETWEEN ? AND ?";
      $paramsRech = array_merge($paramsRech, [$fecha_inicio, $fecha_fin]);
      $tiposRech .= 'ss';
    }
  }

  $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'
    $condicionReclutadores
    $condRech
    $condRechAcum
  ";
  $stmt2 = $conn->prepare($sqlRech);
  if (!$stmt2) throw new Exception("Error en prepare (stmt2): " . $conn->error);
  if (!empty($paramsRech)) {
    $stmt2->bind_param($tiposRech, ...$paramsRech);
  }
  if (!$stmt2->execute()) {
    throw new Exception("Error ejecutando stmt2: " . $stmt2->error);
  }
  $result2 = $stmt2->get_result()->fetch_assoc();
  $response['totales']['rechazados'] = (int)($result2['total'] ?? 0);

  // CONTRATADOS
  $condCont = '';
  $condContAcum = '';
  $paramsCont = [];
  $tiposCont = '';

  // Primero agregar reclutadores
  $paramsCont = $reclutadores;
  $tiposCont = str_repeat('s', count($reclutadores));

  if ($fecha_inicio && $fecha_fin) {
    if (!$incluirAnteriores) {
      $condCont = "AND DATE(se.fecha_contrato) BETWEEN ? AND ?";
      $condContAcum = "AND DATE(a.fecha_registro) >= ?";
      $paramsCont = array_merge($paramsCont, [$fecha_inicio, $fecha_fin, $fecha_inicio]);
      $tiposCont .= 'sss';
    } else {
      $condCont = "AND DATE(se.fecha_contrato) BETWEEN ? AND ?";
      $paramsCont = array_merge($paramsCont, [$fecha_inicio, $fecha_fin]);
      $tiposCont .= 'ss'; 
    }
  }

  $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 1=1
      $condicionReclutadores
      $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);
  }
  if (!$stmt3->execute()) {
    throw new Exception("Error ejecutando stmt3: " . $stmt3->error);
  }
  $result3 = $stmt3->get_result()->fetch_assoc();
  $response['totales']['contratados'] = (int)($result3['total'] ?? 0);

  // ASIGNADOS
  $condAsig = '';
  $paramsAsig = [];
  $tiposAsig = '';

  // Primero agregar reclutadores
  $paramsAsig = $reclutadores;
  $tiposAsig = str_repeat('s', count($reclutadores));

  if ($fecha_fin && $fecha_inicio) {
    $condAsig = "AND DATE(a.fecha_registro) BETWEEN ? AND ?";
    $paramsAsig = array_merge($paramsAsig, [$fecha_inicio, $fecha_fin]);
    $tiposAsig .= 'ss';
  }

  $sqlAsignados = "
    SELECT COUNT(*) AS total
    FROM aspirantes a
    WHERE 1=1
    $condicionReclutadores
    $condAsig
  ";
  $stmt4 = $conn->prepare($sqlAsignados);
  if (!$stmt4) throw new Exception("Error en prepare (stmt4): " . $conn->error);
  if (!empty($paramsAsig)) {
    $stmt4->bind_param($tiposAsig, ...$paramsAsig);
  }
  if (!$stmt4->execute()) {
    throw new Exception("Error ejecutando stmt4: " . $stmt4->error);
  }
  $result4 = $stmt4->get_result()->fetch_assoc();
  $response['totales']['asignados'] = (int)($result4['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, $fecha_fin];
      $tiposPend = 'ssss';

    }else{
      $condPendSubquery = "WHERE DATE(fecha) <= ?";
      $condPendWhere = "AND DATE(a.fecha_registro) <= ?";
      $condPendBanco = "AND DATE(fecha_ingreso) <= ?";
      $paramsPend = [$fecha_fin, $fecha_fin, $fecha_fin];
      $tiposPend = 'sss';
    }
  }

  // Agregar reclutadores
  $paramsPend = array_merge($paramsPend, $reclutadores);
  $tiposPend .= str_repeat('s', count($reclutadores));


  $sqlPendientes = "
    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.id NOT IN (
        SELECT aspirante_id FROM banco_registros 
        WHERE estatus = 'pendiente'
        $condPendBanco
    )
    $condicionReclutadores
  ";
  $stmt5 = $conn->prepare($sqlPendientes);
  if (!$stmt5) throw new Exception("Error en prepare (stmt5): " . $conn->error);
  if (!empty($paramsPend)) {
    $stmt5->bind_param($tiposPend, ...$paramsPend);
  }
  if (!$stmt5->execute()) {
    throw new Exception("Error ejecutando stmt5: " . $stmt5->error);
  }
  $result5 = $stmt5->get_result()->fetch_assoc();
  $response['totales']['pendientes'] = (int)($result5['total'] ?? 0);

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

  // Primero agregar reclutadores
  $paramsBanco = $reclutadores;
  $tiposBanco = str_repeat('s', count($reclutadores));

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

  $sqlBanco = "
  SELECT COUNT(*) AS total
  FROM banco_registros b LEFT JOIN aspirantes a ON a.id = b.aspirante_id
  WHERE b.estatus = 'pendiente'
  $condicionReclutadores
  $condBanco
  $condBancoAcum
  ";
  $stmt6 = $conn->prepare($sqlBanco);
  if (!$stmt6) throw new Exception("Error en prepare (stmt6): " . $conn->error);
  if (!empty($paramsBanco)) {
    $stmt6->bind_param($tiposBanco, ...$paramsBanco);
  }
  if (!$stmt6->execute()) {
    throw new Exception("Error ejecutando stmt6: " . $stmt6->error);
  }
  $result6 = $stmt6->get_result()->fetch_assoc();
  $response['totales']['en_banco'] = (int)($result6['total'] ?? 0);

  // ---------- POR RECLUTADOR ----------
  $condPorReclutador = '';
  $paramsRecl = [];
  $tiposRecl = '';
  $condRechazados = "IS NOT NULL";


  $sql = "
    SELECT 
      r.attuid, r.nombre, r.apellido_paterno, r.apellido_materno, r.rol, r.activo,
      SUM(CASE 
          WHEN a.estatus_actual NOT IN (
            'asignado', 'rechazado', 'contratado', 'en_pre_alta', 'en_plantilla', 'proceso_concluido'
          )
          AND a.id NOT IN (
            SELECT aspirante_id FROM banco_registros WHERE estatus = 'pendiente'
          )
          THEN 1 ELSE 0 END
      ) AS en_proceso,
      SUM(CASE 
          WHEN a.estatus_actual = 'rechazado'
            AND a.id NOT IN (
              SELECT aspirante_id FROM banco_registros WHERE estatus = 'pendiente'
            )
            AND DATE(se.ultima_fecha)
          THEN 1 ELSE 0 END
      ) AS rechazados
    FROM reclutadores r
    LEFT JOIN aspirantes a ON a.attuid = r.attuid
    LEFT 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 r.rol IN ('reclutador', 'admin')
    AND r.activo = 1
    GROUP BY r.attuid
  ";

  $stmt7 = $conn->prepare($sql);
  if (!$stmt7) throw new Exception("Error en prepare (stmt7): " . $conn->error);
  if (!empty($paramsRecl)) {
    $stmt7->bind_param($tiposRecl, ...$paramsRecl);
  }
  if (!$stmt7->execute()) {
    throw new Exception("Error ejecutando stmt7: " . $stmt7->error);
  }
  $result7 = $stmt7->get_result();

  while ($row = $result7->fetch_assoc()) {
    $response['reclutadores'][] = [
      'nombre_completo' => $row['nombre'] . ' ' . $row['apellido_paterno'] . ' ' . $row['apellido_materno'],
      'attuid' => $row['attuid'],
      'rol' => $row['rol'] ?? '0',
      'activo' => isset($row['activo']) ? (int)$row['activo'] : null,
      'en_proceso' => (int)($row['en_proceso'] ?? 0),
      'rechazados' => (int)($row['rechazados'] ?? 0)
    ];
  }


  $response['success'] = true;
} catch (Exception $e) {
  $response['message'] = 'Error: ' . $e->getMessage();
  error_log('[get_panel_admin.php] ' . $e->getMessage());
}

echo json_encode($response);
?>
