<?php
// referencias_educativas/crud.php

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

header("Access-Control-Allow-Origin: *");
header("Access-Control-Allow-Headers: Content-Type");
header("Access-Control-Allow-Methods: POST, OPTIONS");
header("Content-Type: application/json; charset=utf-8");

if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') {
  http_response_code(200);
  exit;
}

if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
  http_response_code(405);
  echo json_encode(["success" => false, "message" => "Método no permitido. Usa POST."]);
  exit;
}

require_once(__DIR__ . '/../config.php'); // $mysqli

$raw = file_get_contents("php://input");
$data = json_decode($raw, true);

if (!$data) {
  http_response_code(400);
  echo json_encode([
    "success" => false,
    "message" => "JSON inválido o vacío.",
    "raw" => $raw
  ]);
  exit;
}

// ================== HELPERS ==================
function clean($v) {
  if (!isset($v)) return null;
  $v = trim((string)$v);
  return $v === '' ? null : $v;
}

function cleanDate($v) {
  $v = clean($v);
  if (!$v) return null;

  if (preg_match('/^\d{4}-\d{2}-\d{2}$/', $v)) return $v;

  if (preg_match('/^\d{2}\/\d{2}\/\d{4}$/', $v)) {
    [$d,$m,$y] = explode('/', $v);
    return "$y-$m-$d";
  }

  return null;
}

function bindParamsDynamic(mysqli_stmt $stmt, string $types, array $params) {
  $refs = [];
  foreach ($params as $k => $v) {
    $refs[$k] = &$params[$k];
  }
  array_unshift($refs, $types);
  if (!call_user_func_array([$stmt, 'bind_param'], $refs)) {
    throw new Exception("Error en bind_param (types=$types)");
  }
}

// ================== ROUTER ==================
$operation = strtolower(trim((string)($data['operation'] ?? 'create')));

try {

  // =========================================================
  // ✅ CREATE (batch)
  // =========================================================
  if ($operation === 'create') {

    $ID_ESTUDIO = (int)($data['ID_ESTUDIO'] ?? 0);
    $ID_CANDIDATO_EMPRESA = (int)($data['ID_CANDIDATO_EMPRESA'] ?? 0);
    $USUARIO_CREA = (int)($data['USUARIO_CREA'] ?? 0);
    $referencias = $data['referencias'] ?? [];

    if ($ID_ESTUDIO <= 0 || $ID_CANDIDATO_EMPRESA <= 0 || $USUARIO_CREA <= 0) {
      http_response_code(400);
      echo json_encode([
        "success" => false,
        "message" => "Faltan campos obligatorios: ID_ESTUDIO, ID_CANDIDATO_EMPRESA, USUARIO_CREA."
      ]);
      exit;
    }

    if (!is_array($referencias) || count($referencias) === 0) {
      http_response_code(400);
      echo json_encode([
        "success" => false,
        "message" => "No se recibieron referencias educativas."
      ]);
      exit;
    }

    $sql = "
    INSERT INTO REFERENCIAS_EDUCATIVAS (
      ID_ESTUDIO,
      ID_CANDIDATO_EMPRESA,

      INSTITUCION,
      NIVEL_EDUCATIVO,
      TITULO_OBTENIDO,
      ESTADO_ESTUDIO,
      FECHA_INICIO,
      FECHA_FIN,

      CIUDAD,
      TELEFONO,
      CORREO,

      CONTACTO_NOMBRE,
      CONTACTO_CARGO,
      OBSERVACIONES,

      NUMERO_ACTA,
      FOLIO,
      LIBRO,

      USUARIO_CREA,
      FECHA_CREACION,
      ESTADO_REGISTRO
    ) VALUES (
      ?, ?,
      ?, ?, ?, ?,
      ?, ?,
      ?, ?, ?,
      ?, ?, ?,
      ?, ?, ?,
      ?,
      NOW(),
      1
    )
    ";

    $stmt = $mysqli->prepare($sql);
    if (!$stmt) {
      http_response_code(500);
      echo json_encode(["success" => false, "message" => "Error preparando SQL.", "error" => $mysqli->error]);
      exit;
    }

    $mysqli->begin_transaction();

    $inserted = 0;
    $ids = [];

    foreach ($referencias as $r) {
      $INSTITUCION     = clean($r['INSTITUCION'] ?? null);
      $NIVEL_EDUCATIVO = clean($r['NIVEL_EDUCATIVO'] ?? null);
      $TITULO_OBTENIDO = clean($r['TITULO_OBTENIDO'] ?? null);
      $ESTADO_ESTUDIO  = clean($r['ESTADO_ESTUDIO'] ?? null);
      $FECHA_INICIO    = cleanDate($r['FECHA_INICIO'] ?? null);
      $FECHA_FIN       = cleanDate($r['FECHA_FIN'] ?? null);

      $CIUDAD          = clean($r['CIUDAD'] ?? null);
      $TELEFONO        = clean($r['TELEFONO'] ?? null);
      $CORREO          = clean($r['CORREO'] ?? null);

      $CONTACTO_NOMBRE = clean($r['CONTACTO_NOMBRE'] ?? null);
      $CONTACTO_CARGO  = clean($r['CONTACTO_CARGO'] ?? null);
      $OBSERVACIONES   = clean($r['OBSERVACIONES'] ?? null);

      $NUMERO_ACTA     = clean($r['NUMERO_ACTA'] ?? null);
      $FOLIO           = clean($r['FOLIO'] ?? null);
      $LIBRO           = clean($r['LIBRO'] ?? null);

      // Ignorar fila vacía (incluye nuevos campos)
      if (
        !$INSTITUCION && !$NIVEL_EDUCATIVO && !$TITULO_OBTENIDO &&
        !$CIUDAD && !$TELEFONO && !$CORREO && !$CONTACTO_NOMBRE && !$OBSERVACIONES &&
        !$NUMERO_ACTA && !$FOLIO && !$LIBRO
      ) {
        continue;
      }

      $params = [
        $ID_ESTUDIO,
        $ID_CANDIDATO_EMPRESA,

        $INSTITUCION,
        $NIVEL_EDUCATIVO,
        $TITULO_OBTENIDO,
        $ESTADO_ESTUDIO,
        $FECHA_INICIO,
        $FECHA_FIN,

        $CIUDAD,
        $TELEFONO,
        $CORREO,

        $CONTACTO_NOMBRE,
        $CONTACTO_CARGO,
        $OBSERVACIONES,

        $NUMERO_ACTA,
        $FOLIO,
        $LIBRO,

        $USUARIO_CREA
      ];

      // 2 ints + 15 strings + 1 int = 18
      $types = "ii" . str_repeat("s", 15) . "i";

      bindParamsDynamic($stmt, $types, $params);

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

      $inserted++;
      $ids[] = $mysqli->insert_id;
    }

    $mysqli->commit();

    echo json_encode([
      "success" => true,
      "message" => "Referencias educativas guardadas correctamente.",
      "inserted" => $inserted,
      "ids" => $ids
    ]);
    exit;
  }

  // =========================================================
  // ✅ UPDATE (1 registro)
  // =========================================================
  if ($operation === 'update') {

    $ID_REFERENCIA_EDUCATIVA = (int)($data['ID_REFERENCIA_EDUCATIVA'] ?? 0);
    $USUARIO_CREA = (int)($data['USUARIO_CREA'] ?? 0);

    if ($ID_REFERENCIA_EDUCATIVA <= 0) {
      http_response_code(400);
      echo json_encode(["success" => false, "message" => "Falta ID_REFERENCIA_EDUCATIVA"]);
      exit;
    }

    // Campos editables
    $INSTITUCION     = clean($data['INSTITUCION'] ?? null);
    $NIVEL_EDUCATIVO = clean($data['NIVEL_EDUCATIVO'] ?? null);
    $TITULO_OBTENIDO = clean($data['TITULO_OBTENIDO'] ?? null);
    $ESTADO_ESTUDIO  = clean($data['ESTADO_ESTUDIO'] ?? null);
    $FECHA_INICIO    = cleanDate($data['FECHA_INICIO'] ?? null);
    $FECHA_FIN       = cleanDate($data['FECHA_FIN'] ?? null);

    $CIUDAD          = clean($data['CIUDAD'] ?? null);
    $TELEFONO        = clean($data['TELEFONO'] ?? null);
    $CORREO          = clean($data['CORREO'] ?? null);

    $CONTACTO_NOMBRE = clean($data['CONTACTO_NOMBRE'] ?? null);
    $CONTACTO_CARGO  = clean($data['CONTACTO_CARGO'] ?? null);
    $OBSERVACIONES   = clean($data['OBSERVACIONES'] ?? null);

    $NUMERO_ACTA     = clean($data['NUMERO_ACTA'] ?? null);
    $FOLIO           = clean($data['FOLIO'] ?? null);
    $LIBRO           = clean($data['LIBRO'] ?? null);

    $sql = "
      UPDATE REFERENCIAS_EDUCATIVAS
      SET
        INSTITUCION = ?,
        NIVEL_EDUCATIVO = ?,
        TITULO_OBTENIDO = ?,
        ESTADO_ESTUDIO = ?,
        FECHA_INICIO = ?,
        FECHA_FIN = ?,
        CIUDAD = ?,
        TELEFONO = ?,
        CORREO = ?,
        CONTACTO_NOMBRE = ?,
        CONTACTO_CARGO = ?,
        OBSERVACIONES = ?,
        NUMERO_ACTA = ?,
        FOLIO = ?,
        LIBRO = ?
      WHERE ID_REFERENCIA_EDUCATIVA = ?
        AND ESTADO_REGISTRO = 1
      LIMIT 1
    ";

    $stmt = $mysqli->prepare($sql);
    if (!$stmt) {
      http_response_code(500);
      echo json_encode(["success" => false, "message" => "Error preparando SQL update.", "error" => $mysqli->error]);
      exit;
    }

    // 15 strings + 1 int
    $types = str_repeat("s", 15) . "i";
    $params = [
      $INSTITUCION,
      $NIVEL_EDUCATIVO,
      $TITULO_OBTENIDO,
      $ESTADO_ESTUDIO,
      $FECHA_INICIO,
      $FECHA_FIN,
      $CIUDAD,
      $TELEFONO,
      $CORREO,
      $CONTACTO_NOMBRE,
      $CONTACTO_CARGO,
      $OBSERVACIONES,
      $NUMERO_ACTA,
      $FOLIO,
      $LIBRO,
      $ID_REFERENCIA_EDUCATIVA
    ];

    bindParamsDynamic($stmt, $types, $params);

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

    echo json_encode([
      "success" => true,
      "message" => "Referencia educativa actualizada correctamente.",
      "updated" => $stmt->affected_rows
    ]);
    exit;
  }

  // =========================================================
  // ✅ DELETE (soft delete)
  // =========================================================
  if ($operation === 'delete') {

    $ID_REFERENCIA_EDUCATIVA = (int)($data['ID_REFERENCIA_EDUCATIVA'] ?? 0);
    if ($ID_REFERENCIA_EDUCATIVA <= 0) {
      http_response_code(400);
      echo json_encode(["success" => false, "message" => "Falta ID_REFERENCIA_EDUCATIVA"]);
      exit;
    }

    $sql = "
      UPDATE REFERENCIAS_EDUCATIVAS
      SET ESTADO_REGISTRO = 0
      WHERE ID_REFERENCIA_EDUCATIVA = ?
      LIMIT 1
    ";

    $stmt = $mysqli->prepare($sql);
    if (!$stmt) {
      http_response_code(500);
      echo json_encode(["success" => false, "message" => "Error preparando SQL delete.", "error" => $mysqli->error]);
      exit;
    }

    $stmt->bind_param("i", $ID_REFERENCIA_EDUCATIVA);

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

    echo json_encode([
      "success" => true,
      "message" => "Referencia educativa eliminada correctamente.",
      "deleted" => $stmt->affected_rows
    ]);
    exit;
  }

  // =========================================================
  // ❌ operación inválida
  // =========================================================
  http_response_code(400);
  echo json_encode([
    "success" => false,
    "message" => "Operación inválida. Usa create | update | delete."
  ]);
  exit;

} catch (Exception $e) {
  if ($mysqli && $mysqli->errno) {
    // Si hay transacción abierta, intenta rollback
    @ $mysqli->rollback();
  }
  http_response_code(500);
  echo json_encode([
    "success" => false,
    "message" => "Error en operación de referencias educativas.",
    "error" => $e->getMessage()
  ]);
  exit;
}
