<?php
// api_poligrafia/estudio_seguridad/personal/upsert.php

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

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

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

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

function respond($success, $message, $data = null, $code = 200) {
  http_response_code($code);
  echo json_encode([
    "success" => $success,
    "message" => $message,
    "data" => $data
  ], JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
  exit;
}

function pick($arr, $keys, $default = null) {
  foreach ((array)$keys as $k) {
    if (array_key_exists($k, $arr)) return $arr[$k];
  }
  return $default;
}

function cleanText($v) {
  if ($v === null) return null;
  $v = trim((string)$v);
  return $v === '' ? null : $v;
}

function cleanInt($v) {
  if ($v === null) return null;
  if ($v === '' || $v === false) return null;
  $n = (int)$v;
  return $n === 0 ? null : $n;
}

function cleanDate($v) {
  $v = cleanText($v);
  if (!$v) return null;
  // espera YYYY-MM-DD
  if (!preg_match('/^\d{4}-\d{2}-\d{2}$/', $v)) return null;
  return $v;
}

try {
  if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
    respond(false, "Método no permitido", null, 405);
  }

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

  if (!is_array($body)) {
    respond(false, "JSON inválido", ["raw" => $raw], 400);
  }

  // Obligatorios
  $ID_ESTUDIO          = cleanInt(pick($body, ['ID_ESTUDIO', 'id_estudio']));
  $ID_CANDIDATO_EMPRESA= cleanInt(pick($body, ['ID_CANDIDATO_EMPRESA', 'id_candidato_empresa']));
  $USUARIO_CREA        = cleanInt(pick($body, ['USUARIO_CREA', 'usuario_crea']));

  if (!$ID_ESTUDIO || !$ID_CANDIDATO_EMPRESA || !$USUARIO_CREA) {
    respond(false, "Faltan campos obligatorios: ID_ESTUDIO, ID_CANDIDATO_EMPRESA, USUARIO_CREA", null, 422);
  }

  // Campos (según tu CREATE TABLE)
  $EMPRESA_ID = cleanInt(pick($body, ['EMPRESA_ID', 'empresa_id', 'EMPRESA', 'empresa']));

  $CIUDAD = cleanText(pick($body, ['CIUDAD', 'ciudad']));
  $PERSONA_ATIENDE = cleanText(pick($body, ['PERSONA_ATIENDE', 'persona_atiende', 'personaAtiende']));
  $PARENTESCO = cleanText(pick($body, ['PARENTESCO', 'parentesco']));
  $ESTADO_CIVIL = cleanText(pick($body, ['ESTADO_CIVIL', 'estado_civil', 'estadoCivil']));

  $CEDULA = cleanText(pick($body, ['CEDULA', 'cedula']));
  $FECHA_EXPEDICION = cleanDate(pick($body, ['FECHA_EXPEDICION', 'fecha_expedicion', 'fechaExpedicion']));
  $LUGAR_EXPEDICION = cleanText(pick($body, ['LUGAR_EXPEDICION', 'lugar_expedicion', 'lugarExpedicion']));

  $FECHA_NACIMIENTO = cleanDate(pick($body, ['FECHA_NACIMIENTO', 'fecha_nacimiento', 'fechaNacimiento']));
  $LUGAR_NACIMIENTO = cleanText(pick($body, ['LUGAR_NACIMIENTO', 'lugar_nacimiento', 'lugarNacimiento']));

  $NR_LIBRETA_MILITAR = cleanText(pick($body, ['NR_LIBRETA_MILITAR', 'nr_libreta_militar', 'nrLibretaMilitar']));
  $CLASE_LIBRETA_MILITAR = cleanText(pick($body, ['CLASE_LIBRETA_MILITAR', 'clase_libreta_militar', 'claseLibretaMilitar']));
  $CEDULA_MILITAR = cleanText(pick($body, ['CEDULA_MILITAR', 'cedula_militar', 'cedulaMilitar']));

  $PORTE_ARMA_NUMERO = cleanText(pick($body, ['PORTE_ARMA_NUMERO', 'porte_arma_numero', 'porteArmaNumero']));
  $CLASE_ARMA = cleanText(pick($body, ['CLASE_ARMA', 'clase_arma', 'claseArma']));

  $DIRECCION_RESIDENCIA = cleanText(pick($body, ['DIRECCION_RESIDENCIA', 'direccion_residencia', 'direccionResidencia']));
  $BARRIO = cleanText(pick($body, ['BARRIO', 'barrio']));
  $ESTRATO = cleanText(pick($body, ['ESTRATO', 'estrato']));
  $ZONA = cleanText(pick($body, ['ZONA', 'zona']));
  $TELEFONO_CONTACTO = cleanText(pick($body, ['TELEFONO_CONTACTO', 'telefono_contacto', 'telefonoContacto']));

  $ANTECEDENTES_PROCURADURIA = cleanText(pick($body, ['ANTECEDENTES_PROCURADURIA', 'antecedentes_procuraduria', 'antecedentesProcuraduria']));
  $CONSULTA_ANTECEDENTES = cleanText(pick($body, ['CONSULTA_ANTECEDENTES', 'consulta_antecedentes', 'consultaAntecedentes']));
  $FECHA_EXPEDICION_CONSULTA = cleanDate(pick($body, ['FECHA_EXPEDICION_CONSULTA', 'fecha_expedicion_consulta', 'fechaExpedicionConsulta']));

  $NUMERO_PASAPORTE = cleanText(pick($body, ['NUMERO_PASAPORTE', 'numero_pasaporte', 'numeroPasaporte']));
  $VISA_NUMERO = cleanText(pick($body, ['VISA_NUMERO', 'visa_numero', 'visaNumero']));
  $LICENCIA_CONDUCCION = cleanText(pick($body, ['LICENCIA_CONDUCCION', 'licencia_conduccion', 'licenciaConduccion']));
  $TIPO_VEHICULO = cleanText(pick($body, ['TIPO_VEHICULO', 'tipo_vehiculo', 'tipoVehiculo']));

  $FONDO_PENSIONES = cleanText(pick($body, ['FONDO_PENSIONES', 'fondo_pensiones', 'fondoPensiones']));
  $EPS = cleanText(pick($body, ['EPS', 'eps']));
  $TIPO_SANGRE = cleanText(pick($body, ['TIPO_SANGRE', 'tipo_sangre', 'tipoSangre']));
  $RH = cleanText(pick($body, ['RH', 'rh']));

  // ✅ UPSERT por UNIQUE(ID_ESTUDIO)
  // Truco: en DUPLICATE forzamos insert_id también en UPDATE
  $sql = "
    INSERT INTO ESTUDIO_DATOS_PERSONALES (
      ID_ESTUDIO, ID_CANDIDATO_EMPRESA, EMPRESA_ID,
      CIUDAD, PERSONA_ATIENDE, PARENTESCO, ESTADO_CIVIL,
      CEDULA, FECHA_EXPEDICION, LUGAR_EXPEDICION,
      FECHA_NACIMIENTO, LUGAR_NACIMIENTO,
      NR_LIBRETA_MILITAR, CLASE_LIBRETA_MILITAR, CEDULA_MILITAR,
      PORTE_ARMA_NUMERO, CLASE_ARMA,
      DIRECCION_RESIDENCIA, BARRIO, ESTRATO, ZONA, TELEFONO_CONTACTO,
      ANTECEDENTES_PROCURADURIA, CONSULTA_ANTECEDENTES, FECHA_EXPEDICION_CONSULTA,
      NUMERO_PASAPORTE, VISA_NUMERO, LICENCIA_CONDUCCION, TIPO_VEHICULO,
      FONDO_PENSIONES, EPS, TIPO_SANGRE, RH,
      USUARIO_CREA
    ) VALUES (
      ?, ?, ?,
      ?, ?, ?, ?,
      ?, ?, ?,
      ?, ?,
      ?, ?, ?,
      ?, ?,
      ?, ?, ?, ?, ?,
      ?, ?, ?,
      ?, ?, ?, ?,
      ?, ?, ?, ?,
      ?
    )
    ON DUPLICATE KEY UPDATE
      ID_DATOS_PERSONALES = LAST_INSERT_ID(ID_DATOS_PERSONALES),
      ID_CANDIDATO_EMPRESA = VALUES(ID_CANDIDATO_EMPRESA),
      EMPRESA_ID = VALUES(EMPRESA_ID),
      CIUDAD = VALUES(CIUDAD),
      PERSONA_ATIENDE = VALUES(PERSONA_ATIENDE),
      PARENTESCO = VALUES(PARENTESCO),
      ESTADO_CIVIL = VALUES(ESTADO_CIVIL),
      CEDULA = VALUES(CEDULA),
      FECHA_EXPEDICION = VALUES(FECHA_EXPEDICION),
      LUGAR_EXPEDICION = VALUES(LUGAR_EXPEDICION),
      FECHA_NACIMIENTO = VALUES(FECHA_NACIMIENTO),
      LUGAR_NACIMIENTO = VALUES(LUGAR_NACIMIENTO),
      NR_LIBRETA_MILITAR = VALUES(NR_LIBRETA_MILITAR),
      CLASE_LIBRETA_MILITAR = VALUES(CLASE_LIBRETA_MILITAR),
      CEDULA_MILITAR = VALUES(CEDULA_MILITAR),
      PORTE_ARMA_NUMERO = VALUES(PORTE_ARMA_NUMERO),
      CLASE_ARMA = VALUES(CLASE_ARMA),
      DIRECCION_RESIDENCIA = VALUES(DIRECCION_RESIDENCIA),
      BARRIO = VALUES(BARRIO),
      ESTRATO = VALUES(ESTRATO),
      ZONA = VALUES(ZONA),
      TELEFONO_CONTACTO = VALUES(TELEFONO_CONTACTO),
      ANTECEDENTES_PROCURADURIA = VALUES(ANTECEDENTES_PROCURADURIA),
      CONSULTA_ANTECEDENTES = VALUES(CONSULTA_ANTECEDENTES),
      FECHA_EXPEDICION_CONSULTA = VALUES(FECHA_EXPEDICION_CONSULTA),
      NUMERO_PASAPORTE = VALUES(NUMERO_PASAPORTE),
      VISA_NUMERO = VALUES(VISA_NUMERO),
      LICENCIA_CONDUCCION = VALUES(LICENCIA_CONDUCCION),
      TIPO_VEHICULO = VALUES(TIPO_VEHICULO),
      FONDO_PENSIONES = VALUES(FONDO_PENSIONES),
      EPS = VALUES(EPS),
      TIPO_SANGRE = VALUES(TIPO_SANGRE),
      RH = VALUES(RH),
      USUARIO_ACTUALIZA = VALUES(USUARIO_CREA),
      FECHA_ACTUALIZA = NOW(),
      ESTADO_REGISTRO = 1
  ";

  $stmt = $mysqli->prepare($sql);
  if (!$stmt) {
    respond(false, "Error prepare: " . $mysqli->error, null, 500);
  }

  // 34 parámetros:
  // 1-3: i i i
  // 4-33: 30 strings
  // 34: i
  $types = "iii" . str_repeat("s", 30) . "i";

  $stmt->bind_param(
    $types,
    $ID_ESTUDIO,
    $ID_CANDIDATO_EMPRESA,
    $EMPRESA_ID,

    $CIUDAD,
    $PERSONA_ATIENDE,
    $PARENTESCO,
    $ESTADO_CIVIL,

    $CEDULA,
    $FECHA_EXPEDICION,
    $LUGAR_EXPEDICION,

    $FECHA_NACIMIENTO,
    $LUGAR_NACIMIENTO,

    $NR_LIBRETA_MILITAR,
    $CLASE_LIBRETA_MILITAR,
    $CEDULA_MILITAR,

    $PORTE_ARMA_NUMERO,
    $CLASE_ARMA,

    $DIRECCION_RESIDENCIA,
    $BARRIO,
    $ESTRATO,
    $ZONA,
    $TELEFONO_CONTACTO,

    $ANTECEDENTES_PROCURADURIA,
    $CONSULTA_ANTECEDENTES,
    $FECHA_EXPEDICION_CONSULTA,

    $NUMERO_PASAPORTE,
    $VISA_NUMERO,
    $LICENCIA_CONDUCCION,
    $TIPO_VEHICULO,

    $FONDO_PENSIONES,
    $EPS,
    $TIPO_SANGRE,
    $RH,

    $USUARIO_CREA
  );

  if (!$stmt->execute()) {
    $err = $stmt->error;
    $stmt->close();
    respond(false, "Error execute: " . $err, null, 500);
  }

  $id = $stmt->insert_id; // gracias al LAST_INSERT_ID sirve para insert y update
  $stmt->close();

  respond(true, "Sección PERSONAL guardada/actualizada", [
    "ID_ESTUDIO" => $ID_ESTUDIO,
    "ID_DATOS_PERSONALES" => (int)$id
  ]);

} catch (Exception $e) {
  respond(false, $e->getMessage(), null, 500);
}
