<?php
// api_poligrafia/estudio_seguridad/familiares/upsert_batch.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 ? $n : null;
}

function cleanEnum($v, $allowed) {
  $v = cleanText($v);
  if (!$v) return null;
  return in_array($v, $allowed, true) ? $v : null;
}

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);
  }

  $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']));
  $FAMILIARES           = pick($body, ['FAMILIARES', 'familiares'], []);

  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($FAMILIARES)) {
    respond(false, "FAMILIARES debe ser un array", null, 422);
  }

  // Iniciar transacción
  $mysqli->begin_transaction();

  // 1) Prepara statements
  $sqlInsert = "
    INSERT INTO ESTUDIO_FAMILIARES (
      ID_ESTUDIO,
      ID_CANDIDATO_EMPRESA,
      NOMBRE_COMPLETO,
      RESIDE_CON_PERSONA,
      PARENTESCO,
      EDAD,
      ESTADO_CIVIL,
      ACTIVIDAD_LABORAL,
      TELEFONO,
      USUARIO_CREA,
      FECHA_CREACION,
      ESTADO_REGISTRO
    ) VALUES (
      ?, ?,
      ?, ?,
      ?, ?,
      ?, ?,
      ?,
      ?,
      NOW(),
      1
    )
  ";
  $stmtInsert = $mysqli->prepare($sqlInsert);
  if (!$stmtInsert) throw new Exception("Error prepare INSERT: " . $mysqli->error);

  $sqlUpdate = "
    UPDATE ESTUDIO_FAMILIARES SET
      NOMBRE_COMPLETO = ?,
      RESIDE_CON_PERSONA = ?,
      PARENTESCO = ?,
      EDAD = ?,
      ESTADO_CIVIL = ?,
      ACTIVIDAD_LABORAL = ?,
      TELEFONO = ?,
      ESTADO_REGISTRO = 1
    WHERE ID_FAMILIAR = ? AND ID_ESTUDIO = ?
    LIMIT 1
  ";
  $stmtUpdate = $mysqli->prepare($sqlUpdate);
  if (!$stmtUpdate) throw new Exception("Error prepare UPDATE: " . $mysqli->error);

  // 2) Procesar filas
  $inserted = 0;
  $updated  = 0;
  $keptIds  = []; // ids que vienen en el payload (para no borrarlos)

  foreach ($FAMILIARES as $i => $f) {
    if (!is_array($f)) continue;

    $ID_FAMILIAR = cleanInt(pick($f, ['ID_FAMILIAR', 'id_familiar']));

    $NOMBRE_COMPLETO = cleanText(pick($f, ['NOMBRE_COMPLETO', 'nombreCompleto', 'nombre_completo']));
    $RESIDE_CON_PERSONA = cleanEnum(pick($f, ['RESIDE_CON_PERSONA', 'resideConPersona', 'reside_con_persona']), ['Sí', 'No']);
    $PARENTESCO = cleanText(pick($f, ['PARENTESCO', 'parentesco']));
    $EDAD = cleanText(pick($f, ['EDAD', 'edad']));
    $ESTADO_CIVIL = cleanText(pick($f, ['ESTADO_CIVIL', 'estadoCivil', 'estado_civil']));
    $ACTIVIDAD_LABORAL = cleanText(pick($f, ['ACTIVIDAD_LABORAL', 'actividadLaboral', 'actividad_laboral']));
    $TELEFONO = cleanText(pick($f, ['TELEFONO', 'telefono']));

    // Si viene ID_FAMILIAR => UPDATE
    if ($ID_FAMILIAR) {
      $stmtUpdate->bind_param(
        "sssssssii",
        $NOMBRE_COMPLETO,
        $RESIDE_CON_PERSONA,
        $PARENTESCO,
        $EDAD,
        $ESTADO_CIVIL,
        $ACTIVIDAD_LABORAL,
        $TELEFONO,
        $ID_FAMILIAR,
        $ID_ESTUDIO
      );

      if (!$stmtUpdate->execute()) {
        throw new Exception("Error UPDATE familiar index {$i}: " . $stmtUpdate->error);
      }

      $updated += ($stmtUpdate->affected_rows >= 0) ? 1 : 0;
      $keptIds[] = $ID_FAMILIAR;
    } else {
      // INSERT
      $stmtInsert->bind_param(
        "iisssssssi",
        $ID_ESTUDIO,
        $ID_CANDIDATO_EMPRESA,
        $NOMBRE_COMPLETO,
        $RESIDE_CON_PERSONA,
        $PARENTESCO,
        $EDAD,
        $ESTADO_CIVIL,
        $ACTIVIDAD_LABORAL,
        $TELEFONO,
        $USUARIO_CREA
      );

      if (!$stmtInsert->execute()) {
        throw new Exception("Error INSERT familiar index {$i}: " . $stmtInsert->error);
      }

      $newId = (int)$stmtInsert->insert_id;
      $inserted++;
      $keptIds[] = $newId;
    }
  }

  $stmtInsert->close();
  $stmtUpdate->close();

  // 3) Soft delete de los que NO vienen (para que quede igual al frontend)
  // Si no quieres esto, me dices y lo quitamos.
  if (count($keptIds) > 0) {
    $placeholders = implode(',', array_fill(0, count($keptIds), '?'));
    $types = str_repeat('i', count($keptIds) + 1); // +1 por ID_ESTUDIO

    $sqlSoft = "
      UPDATE ESTUDIO_FAMILIARES
      SET ESTADO_REGISTRO = 0
      WHERE ID_ESTUDIO = ?
        AND ESTADO_REGISTRO = 1
        AND ID_FAMILIAR NOT IN ($placeholders)
    ";

    $stmtSoft = $mysqli->prepare($sqlSoft);
    if (!$stmtSoft) throw new Exception("Error prepare SOFT DELETE: " . $mysqli->error);

    // bind dinámico
    $params = array_merge([$ID_ESTUDIO], $keptIds);
    $bindNames = [];
    $bindNames[] = $types;

    for ($k = 0; $k < count($params); $k++) {
      $bindNames[] = &$params[$k];
    }

    call_user_func_array([$stmtSoft, 'bind_param'], $bindNames);

    if (!$stmtSoft->execute()) {
      throw new Exception("Error soft delete: " . $stmtSoft->error);
    }
    $softDeleted = $stmtSoft->affected_rows;
    $stmtSoft->close();
  } else {
    // Si mandan array vacío => desactiva todos los familiares del estudio
    $stmtSoftAll = $mysqli->prepare("UPDATE ESTUDIO_FAMILIARES SET ESTADO_REGISTRO = 0 WHERE ID_ESTUDIO = ? AND ESTADO_REGISTRO = 1");
    if (!$stmtSoftAll) throw new Exception("Error prepare SOFT ALL: " . $mysqli->error);
    $stmtSoftAll->bind_param("i", $ID_ESTUDIO);
    if (!$stmtSoftAll->execute()) throw new Exception("Error SOFT ALL: " . $stmtSoftAll->error);
    $softDeleted = $stmtSoftAll->affected_rows;
    $stmtSoftAll->close();
  }

  $mysqli->commit();

  respond(true, "Familiares guardados", [
    "ID_ESTUDIO" => $ID_ESTUDIO,
    "inserted" => $inserted,
    "updated" => $updated,
    "soft_deleted" => $softDeleted ?? 0
  ]);

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