<?php
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);

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; }
if ($_SERVER['REQUEST_METHOD'] !== 'POST') { http_response_code(405); echo json_encode(["success"=>false,"message"=>"Método no permitido"]); 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 (isset($arr[$k])) 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||$v===''||$v===false) return null; return (int)$v; }
function cleanDate($v){
  $v = cleanText($v);
  if(!$v) return null;
  if(!preg_match('/^\d{4}-\d{2}-\d{2}$/', $v)) return null;
  return $v;
}

try {
  $raw = file_get_contents("php://input");
  $body = json_decode($raw, true);
  if (!is_array($body)) respond(false, "JSON inválido", null, 400);

  $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']));
  $items = pick($body, ['items','ITEMS','data','DATA'], []);

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

  $inserted = 0; $updated = 0; $soft_deleted = 0;

  $mysqli->begin_transaction();

  // Traer IDs existentes (para soft delete si no vienen)
  $existing = [];
  $stmt = $mysqli->prepare("SELECT ID_INFO_LABORAL FROM ESTUDIO_INFO_LABORAL WHERE ID_ESTUDIO=? AND ESTADO_REGISTRO=1");
  $stmt->bind_param("i", $ID_ESTUDIO);
  $stmt->execute();
  $res = $stmt->get_result();
  while($r = $res->fetch_assoc()) $existing[(int)$r['ID_INFO_LABORAL']] = true;
  $stmt->close();

  $seenIds = [];

  foreach($items as $it) {
    if(!is_array($it)) continue;

    $ID_INFO_LABORAL = cleanInt(pick($it, ['ID_INFO_LABORAL','id_info_laboral','ID','id']));

    // acepta mayúscula o camelCase
    $EMPRESA = cleanText(pick($it, ['EMPRESA','empresa']));
    $CARGO = cleanText(pick($it, ['CARGO','cargo']));
    $TELEFONO = cleanText(pick($it, ['TELEFONO','telefono']));
    $FECHA_INGRESO = cleanDate(pick($it, ['FECHA_INGRESO','fecha_ingreso','fechaIngreso']));
    $FECHA_RETIRO  = cleanDate(pick($it, ['FECHA_RETIRO','fecha_retiro','fechaRetiro']));
    $MOTIVO_RETIRO = cleanText(pick($it, ['MOTIVO_RETIRO','motivo_retiro','motivoRetiro']));

    // ✅ regla: si toda la fila viene vacía, se ignora
    $hasAny = ($EMPRESA || $CARGO || $TELEFONO || $FECHA_INGRESO || $FECHA_RETIRO || $MOTIVO_RETIRO);
    if(!$hasAny) continue;

    if($ID_INFO_LABORAL) {
      $seenIds[$ID_INFO_LABORAL] = true;

      $sql = "UPDATE ESTUDIO_INFO_LABORAL SET
        EMPRESA=?, CARGO=?, TELEFONO=?,
        FECHA_INGRESO=?, FECHA_RETIRO=?, MOTIVO_RETIRO=?,
        ESTADO_REGISTRO=1,
        USUARIO_CREA=? -- (si luego agregas USUARIO_ACTUALIZA en tabla, cámbialo)
      WHERE ID_INFO_LABORAL=? AND ID_ESTUDIO=?";

      $stmt = $mysqli->prepare($sql);
      $stmt->bind_param(
        "ssssssiiii",
        $EMPRESA, $CARGO, $TELEFONO,
        $FECHA_INGRESO, $FECHA_RETIRO, $MOTIVO_RETIRO,
        $USUARIO_CREA,
        $ID_INFO_LABORAL,
        $ID_ESTUDIO
      );

      if(!$stmt->execute()) throw new Exception("Error UPDATE: ".$stmt->error);
      $updated += ($stmt->affected_rows >= 0) ? 1 : 0;
      $stmt->close();

    } else {
      $sql = "INSERT INTO ESTUDIO_INFO_LABORAL (
        ID_ESTUDIO, ID_CANDIDATO_EMPRESA,
        EMPRESA, CARGO, TELEFONO,
        FECHA_INGRESO, FECHA_RETIRO, MOTIVO_RETIRO,
        USUARIO_CREA, FECHA_CREACION, ESTADO_REGISTRO
      ) VALUES (?,?,?,?,?,?,?,?,?, NOW(), 1)";

      $stmt = $mysqli->prepare($sql);
      $stmt->bind_param(
        "iissssssi",
        $ID_ESTUDIO, $ID_CANDIDATO_EMPRESA,
        $EMPRESA, $CARGO, $TELEFONO,
        $FECHA_INGRESO, $FECHA_RETIRO, $MOTIVO_RETIRO,
        $USUARIO_CREA
      );

      if(!$stmt->execute()) throw new Exception("Error INSERT: ".$stmt->error);
      $inserted++;
      $seenIds[(int)$stmt->insert_id] = true;
      $stmt->close();
    }
  }

  // Soft delete: si existían y ya no vienen en el payload
  foreach($existing as $id => $_) {
    if(!isset($seenIds[$id])) {
      $stmt = $mysqli->prepare("UPDATE ESTUDIO_INFO_LABORAL SET ESTADO_REGISTRO=0 WHERE ID_INFO_LABORAL=? AND ID_ESTUDIO=?");
      $stmt->bind_param("ii", $id, $ID_ESTUDIO);
      if(!$stmt->execute()) throw new Exception("Error SOFT DELETE: ".$stmt->error);
      $soft_deleted++;
      $stmt->close();
    }
  }

  $mysqli->commit();

  respond(true, "Información laboral guardada", [
    "ID_ESTUDIO" => $ID_ESTUDIO,
    "inserted" => $inserted,
    "updated" => $updated,
    "soft_deleted" => $soft_deleted
  ]);

} catch(Exception $e) {
  if(isset($mysqli) && $mysqli->errno === 0) { /* noop */ }
  if(isset($mysqli)) $mysqli->rollback();
  respond(false, $e->getMessage(), null, 500);
}
