<?php 
session_start();
ob_start();

ini_set('display_errors', 0);
ini_set('log_errors', 1);
ini_set('error_log', __DIR__ . '/../logs/error.log');

header("Access-Control-Allow-Origin: *");
header("Access-Control-Allow-Methods: POST");
header("Access-Control-Allow-Headers: Content-Type");
header("Content-Type: application/json");

$response = [];

function limpiarTexto($texto) {
    $texto = trim($texto);
    $texto = preg_replace('/[\x00-\x1F\x7F]/u', '', $texto); // elimina caracteres invisibles
    $texto = mb_strtoupper($texto, 'UTF-8'); // convierte a mayúsculas
       // Reemplaza acentos de forma segura
        $acentos = [
        'Á' => 'A', 'É' => 'E', 'Í' => 'I', 'Ó' => 'O', 'Ú' => 'U', 'Ü' => 'U',
        'Ñ' => 'Ñ', 'Ç' => 'C',
        'á' => 'A', 'é' => 'E', 'í' => 'I', 'ó' => 'O', 'ú' => 'U', 'ü' => 'U',
        'ñ' => 'Ñ', 'ç' => 'C'
    ];
    $texto = strtr($texto, $acentos);

    return $texto;
}

try {
    if (!isset($_SESSION['attuid']) || empty($_SESSION['attuid'])) {
        http_response_code(401);
        throw new Exception("No hay sesión activa");
    }

    include __DIR__ . '/../db/conexion.php';

    $attuidSesion = $_SESSION['attuid'];
    $rolSesion = $_SESSION['rol'] ?? '';

    // Determinar attuid según el rol
    if (in_array($rolSesion, ['capturista', 'capturistaRH'], true)) {
        $sqlReclutadores = "SELECT attuid FROM reclutadores WHERE rol = 'reclutador' AND activo = 1 ORDER BY id ASC";
        $resultReclutadores = $conn->query($sqlReclutadores);
        $reclutadores = [];
        while ($row = $resultReclutadores->fetch_assoc()) {
            $reclutadores[] = $row['attuid'];
        }

        if (empty($reclutadores)) {
            throw new Exception("No hay reclutadores activos disponibles");
        }

        $sqlLastAssigned = "SELECT attuid FROM aspirantes ORDER BY id DESC LIMIT 1";
        $resultLastAssigned = $conn->query($sqlLastAssigned);
        $lastAssigned = $resultLastAssigned->fetch_assoc()['attuid'] ?? null;

        $attuid = $reclutadores[0]; // default
        if ($lastAssigned) {
            $index = array_search($lastAssigned, $reclutadores, true);
            if ($index !== false) {
                $nextIndex = ($index + 1) % count($reclutadores);
                $attuid = $reclutadores[$nextIndex];
            }
        }
    } else {
        $attuid = $attuidSesion;
    }

    if ($_SERVER["REQUEST_METHOD"] !== "POST") {
        throw new Exception("Método no permitido");
    }

    // Captura de datos
    $nombre = limpiarTexto($_POST["nombre"] ?? '');
    $apellido_paterno = limpiarTexto($_POST["apellido_paterno"] ?? '');
    $apellido_materno = limpiarTexto($_POST["apellido_materno"] ?? '');
    $correo = isset($_POST["correo"]) && trim($_POST["correo"]) !== '' ? trim($_POST["correo"]) : null;
    $telefono = limpiarTexto($_POST["telefono"] ?? '');
    $puesto = limpiarTexto($_POST["puesto"] ?? '');
    $ubicacion = limpiarTexto($_POST["ubicacion"] ?? '');
    $estatus_actual = "asignado";
    $pdv_sugerido = isset($_POST['pdv_sugerido']) ? limpiarTexto($_POST['pdv_sugerido']) : null;

    // Procedencia de CV
    $procedencia_cv = isset($_POST['procedencia_cv']) ? limpiarTexto($_POST['procedencia_cv']) : null;


    if (!$nombre || !$apellido_paterno || !$telefono || !$puesto) {
        throw new Exception("Todos los campos obligatorios deben ser completados");
    }

    if (!empty($correo) && !filter_var($correo, FILTER_VALIDATE_EMAIL)) {
        throw new Exception("El formato del correo electrónico no es válido");
    }

    $educacion = json_decode($_POST["educacion"] ?? '[]', true);
    $experiencia = json_decode($_POST["experiencia"] ?? '[]', true);

    $conn->begin_transaction();

    // Generación del folio
    $resultCount = $conn->query("SELECT COUNT(*) AS total FROM aspirantes");
    $rowCount = $resultCount->fetch_assoc();
    $consecutivo = $rowCount['total'] + 1;
    $anio = date('y');
    $letraPuesto = (stripos($puesto, 'gerente') !== false) ? 'G' : 'E';

    $queryMunicipio = $conn->prepare("SELECT municipio, estado FROM catalogo_ubicaciones WHERE id = ?");
    $queryMunicipio->bind_param("s", $ubicacion);
    $queryMunicipio->execute();
    $resMunicipio = $queryMunicipio->get_result()->fetch_assoc();

    if (!$resMunicipio || empty($resMunicipio['municipio'])) {
        throw new Exception("Ubicación no válida o no encontrada");
    }

    $municipioRaw = $resMunicipio['municipio'];
    $municipioSimplificado = strtoupper(substr(preg_replace('/[^A-Za-z]/', '', $municipioRaw), 0, 3));
    $folio = "{$consecutivo}{$anio}-{$letraPuesto}{$municipioSimplificado}";

    // Preparar correo para DB
    $correo_db = $correo ?? null;

    $sql = "INSERT INTO aspirantes 
        (folio, nombre, apellido_paterno, apellido_materno, correo, 
        telefono, puesto, ubicacion, estatus_actual,
        attuid, registrado_por, pdv_sugerido, procedencia_cv)
            VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";

    $stmt = $conn->prepare($sql);
    $registradoPor = $attuidSesion;
    $stmt->bind_param(
        "sssssssssssss",
        $folio,
        $nombre,
        $apellido_paterno,
        $apellido_materno,
        $correo_db,
        $telefono,
        $puesto,
        $ubicacion,
        $estatus_actual,
        $attuid,
        $registradoPor,
        $pdv_sugerido,
        $procedencia_cv
    );

    if (!$stmt->execute()) {
        throw new Exception("Error al registrar aspirante: " . $stmt->error);
    }

    $aspirante_id = $conn->insert_id;

    // Educación
    if (!empty($educacion)) {
        $sql_edu = "INSERT INTO educacion (aspirante_id, institucion, titulo, inicio, fin, actualmente) VALUES (?, ?, ?, ?, ?, ?)";
        $stmt_edu = $conn->prepare($sql_edu);
        foreach ($educacion as $edu) {
            $institucion = limpiarTexto($edu["institucion"] ?? '');
            $titulo = limpiarTexto($edu["titulo"] ?? '');
            $inicio = !empty($edu["inicio"]) ? $edu["inicio"] . '-01' : null;
            $fin = !empty($edu["fin"]) ? $edu["fin"] . '-01' : null;
            $actualmente = isset($edu["actualmente"]) ? (int)$edu["actualmente"] : 0;

            $stmt_edu->bind_param("issssi", $aspirante_id, $institucion, $titulo, $inicio, $fin, $actualmente);
            if (!$stmt_edu->execute()) {
                throw new Exception("Error al registrar educación: " . $stmt_edu->error);
            }
        }
    }

    // Experiencia
    if (!empty($experiencia)) {
        $sql_exp = "INSERT INTO experiencia (aspirante_id, empresa, puesto, inicio, fin, actualmente) VALUES (?, ?, ?, ?, ?, ?)";
        $stmt_exp = $conn->prepare($sql_exp);
        foreach ($experiencia as $exp) {
            $empresa = limpiarTexto($exp["empresa"] ?? '');
            $puesto_exp = limpiarTexto($exp["puesto"] ?? '');
            $inicio_exp = !empty($exp["inicio"]) ? $exp["inicio"] . '-01' : null;
            $fin_exp = !empty($exp["fin"]) ? $exp["fin"] . '-01' : null;
            $trabaja_actualmente = isset($exp["trabaja_actualmente"]) ? (int)$exp["trabaja_actualmente"] : 0;

            $stmt_exp->bind_param("issssi", $aspirante_id, $empresa, $puesto_exp, $inicio_exp, $fin_exp, $trabaja_actualmente);
            if (!$stmt_exp->execute()) {
                throw new Exception("Error al registrar experiencia: " . $stmt_exp->error);
            }
        }
    }

    $conn->commit();
    $response = [
        "status" => "success",
        "message" => "Aspirante registrado correctamente",
        "aspirante_id" => $aspirante_id,
        "folio" => $folio
    ];

} catch (Exception $e) {
    if ($conn && $conn->errno === 0) {
        $conn->rollback();
    }
    error_log("Error en guardar_aspirante.php: " . $e->getMessage());
    $response = ["status" => "error", "message" => $e->getMessage()];
} finally {
    if (isset($stmt)) $stmt->close();
    if (isset($stmt_edu)) $stmt_edu->close();
    if (isset($stmt_exp)) $stmt_exp->close();
    if (isset($conn)) $conn->close();
}

if (ob_get_length()) ob_end_clean();
echo json_encode($response, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
exit();
