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

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

// CORS
header("Access-Control-Allow-Origin: *");
header("Access-Control-Allow-Headers: Content-Type, Authorization");
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'); // debe exponer $mysqli

// ===================== HELPERS =====================
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 cleanText($v) {
  if ($v === null) return null;
  $v = trim((string)$v);
  return $v === '' ? null : $v;
}

function cleanInt($v) {
  if ($v === null) return null;
  $v = trim((string)$v);
  if ($v === '') return null;
  $n = (int)$v;
  return $n > 0 ? $n : null;
}

function toPublicUrl($filename) {
  return "https://devsoul.co/api_poligrafia/uploads/soportes_archivos/" . $filename;
}

function safeJsonEncode($arr) {
  return json_encode($arr, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
}

// ============ UPLOAD CONFIG ============
$UPLOAD_DIR = realpath(__DIR__ . '/../../uploads') . '/soportes_archivos';
if (!$UPLOAD_DIR) {
  // si realpath falla, intenta ruta fija
  $UPLOAD_DIR = __DIR__ . '/../../uploads/soportes_archivos';
}

if (!is_dir($UPLOAD_DIR)) {
  @mkdir($UPLOAD_DIR, 0775, true);
}
if (!is_dir($UPLOAD_DIR) || !is_writable($UPLOAD_DIR)) {
  respond(false, "No se puede escribir en uploads/soportes_archivos. Revisa permisos.", null, 500);
}

function uploadSingle($fieldName, $idEstudio, $prefix, $UPLOAD_DIR) {
  if (!isset($_FILES[$fieldName])) return null;
  $f = $_FILES[$fieldName];
  if (!is_array($f) || ($f['error'] ?? UPLOAD_ERR_NO_FILE) === UPLOAD_ERR_NO_FILE) return null;
  if (($f['error'] ?? UPLOAD_ERR_OK) !== UPLOAD_ERR_OK) return null;

  $tmp  = $f['tmp_name'];
  $orig = $f['name'] ?? 'file';
  $ext  = strtolower(pathinfo($orig, PATHINFO_EXTENSION));
  if ($ext === '') $ext = 'bin';

  // nombre: foto_familiar_32_1700000000_ab12cd.jpg
  $uniq = substr(md5($orig . microtime(true)), 0, 6);
  $filename = "{$prefix}_{$idEstudio}_" . time() . "_{$uniq}.{$ext}";
  $dest = rtrim($UPLOAD_DIR, '/\\') . DIRECTORY_SEPARATOR . $filename;

  if (!move_uploaded_file($tmp, $dest)) return null;

  return toPublicUrl($filename);
}

function uploadMultiple($fieldName, $idEstudio, $prefix, $UPLOAD_DIR) {
  if (!isset($_FILES[$fieldName])) return [];

  $f = $_FILES[$fieldName];
  if (!isset($f['name']) || !is_array($f['name'])) {
    // si viene como archivo único, lo intentamos como single
    $one = uploadSingle($fieldName, $idEstudio, $prefix, $UPLOAD_DIR);
    return $one ? [$one] : [];
  }

  $urls = [];
  $count = count($f['name']);
  for ($i = 0; $i < $count; $i++) {
    $err = $f['error'][$i] ?? UPLOAD_ERR_NO_FILE;
    if ($err === UPLOAD_ERR_NO_FILE) continue;
    if ($err !== UPLOAD_ERR_OK) continue;

    $tmp  = $f['tmp_name'][$i];
    $orig = $f['name'][$i] ?? 'file';
    $ext  = strtolower(pathinfo($orig, PATHINFO_EXTENSION));
    if ($ext === '') $ext = 'bin';

    $uniq = substr(md5($orig . microtime(true) . $i), 0, 6);
    $filename = "{$prefix}_{$idEstudio}_" . time() . "_{$uniq}.{$ext}";
    $dest = rtrim($UPLOAD_DIR, '/\\') . DIRECTORY_SEPARATOR . $filename;

    if (move_uploaded_file($tmp, $dest)) {
      $urls[] = toPublicUrl($filename);
    }
  }
  return $urls;
}

// ===================== MAIN =====================
try {
  // multipart/form-data => datos vienen en $_POST
  $ID_ESTUDIO = cleanInt($_POST['ID_ESTUDIO'] ?? $_POST['id_estudio'] ?? null);
  $ID_CANDIDATO_EMPRESA = cleanInt($_POST['ID_CANDIDATO_EMPRESA'] ?? $_POST['id_candidato_empresa'] ?? null);
  $USUARIO = cleanInt($_POST['USUARIO_CREA'] ?? $_POST['usuario_crea'] ?? $_POST['USUARIO'] ?? null);

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

  // Textos
  $EVIDENCIA_VIDEOLLAMADA = cleanText($_POST['EVIDENCIA_VIDEOLLAMADA'] ?? $_POST['evidenciaVideoLlamada'] ?? null);
  $CONSULTA_ANTECEDENTES_VISITA = cleanText($_POST['CONSULTA_ANTECEDENTES_VISITA'] ?? $_POST['consultaAntecedentesVisita'] ?? null);

  // Ver si existe registro (ID_ESTUDIO es UNIQUE)
  $sqlFind = "SELECT
                FOTO_FAMILIAR_URL,
                FOTO_SALA_COMEDOR_URL,
                FOTO_PERFIL_URL,
                FOTO_FACHADA_URL,
                ADJUNTOS_VISITA_JSON,
                EVIDENCIA_VIDEOLLAMADA,
                CONSULTA_ANTECEDENTES_VISITA
              FROM ESTUDIO_ARCHIVOS_EVIDENCIAS
              WHERE ID_ESTUDIO = ?
              LIMIT 1";
  $stmtFind = $mysqli->prepare($sqlFind);
  if (!$stmtFind) throw new Exception("Error prepare FIND: " . $mysqli->error);
  $stmtFind->bind_param("i", $ID_ESTUDIO);
  $stmtFind->execute();
  $resFind = $stmtFind->get_result();
  $existing = $resFind->fetch_assoc();
  $stmtFind->close();

  // Subidas
  $fotoFamiliar = uploadSingle('fotoFamiliar', $ID_ESTUDIO, 'foto_familiar', $UPLOAD_DIR);
  $fotoSala     = uploadSingle('fotoSalaComedor', $ID_ESTUDIO, 'foto_sala_comedor', $UPLOAD_DIR);
  $fotoPerfil   = uploadSingle('fotoPerfil', $ID_ESTUDIO, 'foto_perfil', $UPLOAD_DIR);
  $fotoFachada  = uploadSingle('fotoFachada', $ID_ESTUDIO, 'foto_fachada', $UPLOAD_DIR);

  $adjuntosNew = uploadMultiple('adjuntosVisita', $ID_ESTUDIO, 'adjunto_visita', $UPLOAD_DIR);

  // Merge con lo existente (si no enviaron un archivo, conserva el anterior)
  $FOTO_FAMILIAR_URL = $fotoFamiliar ?: ($existing['FOTO_FAMILIAR_URL'] ?? null);
  $FOTO_SALA_COMEDOR_URL = $fotoSala ?: ($existing['FOTO_SALA_COMEDOR_URL'] ?? null);
  $FOTO_PERFIL_URL = $fotoPerfil ?: ($existing['FOTO_PERFIL_URL'] ?? null);
  $FOTO_FACHADA_URL = $fotoFachada ?: ($existing['FOTO_FACHADA_URL'] ?? null);

  // Adjuntos: concatena existentes + nuevos
  $oldAdj = [];
  if (!empty($existing['ADJUNTOS_VISITA_JSON'])) {
    $tmp = json_decode($existing['ADJUNTOS_VISITA_JSON'], true);
    if (is_array($tmp)) $oldAdj = $tmp;
  }
  $allAdj = array_values(array_filter(array_merge($oldAdj, $adjuntosNew)));
  $ADJUNTOS_VISITA_JSON = safeJsonEncode($allAdj);

  // Textos: si vienen null, conserva el anterior
  if ($EVIDENCIA_VIDEOLLAMADA === null && isset($existing['EVIDENCIA_VIDEOLLAMADA'])) {
    $EVIDENCIA_VIDEOLLAMADA = $existing['EVIDENCIA_VIDEOLLAMADA'];
  }
  if ($CONSULTA_ANTECEDENTES_VISITA === null && isset($existing['CONSULTA_ANTECEDENTES_VISITA'])) {
    $CONSULTA_ANTECEDENTES_VISITA = $existing['CONSULTA_ANTECEDENTES_VISITA'];
  }

  if ($existing) {
    // ================= UPDATE =================
    $sqlUp = "UPDATE ESTUDIO_ARCHIVOS_EVIDENCIAS SET
                FOTO_FAMILIAR_URL = ?,
                FOTO_SALA_COMEDOR_URL = ?,
                FOTO_PERFIL_URL = ?,
                FOTO_FACHADA_URL = ?,
                ADJUNTOS_VISITA_JSON = ?,
                EVIDENCIA_VIDEOLLAMADA = ?,
                CONSULTA_ANTECEDENTES_VISITA = ?,
                USUARIO_ACTUALIZA = ?,
                FECHA_ACTUALIZA = NOW(),
                ESTADO_REGISTRO = 1
              WHERE ID_ESTUDIO = ?";

    $stmt = $mysqli->prepare($sqlUp);
    if (!$stmt) throw new Exception("Error prepare UPDATE: " . $mysqli->error);

    // 7 strings + 2 ints = 9
    $stmt->bind_param(
      "sssssssii",
      $FOTO_FAMILIAR_URL,
      $FOTO_SALA_COMEDOR_URL,
      $FOTO_PERFIL_URL,
      $FOTO_FACHADA_URL,
      $ADJUNTOS_VISITA_JSON,
      $EVIDENCIA_VIDEOLLAMADA,
      $CONSULTA_ANTECEDENTES_VISITA,
      $USUARIO,
      $ID_ESTUDIO
    );

    if (!$stmt->execute()) throw new Exception("Error execute UPDATE: " . $stmt->error);
    $stmt->close();

    respond(true, "Archivos/Evidencias actualizados", [
      "accion" => "update",
      "ID_ESTUDIO" => $ID_ESTUDIO,
      "urls" => [
        "FOTO_FAMILIAR_URL" => $FOTO_FAMILIAR_URL,
        "FOTO_SALA_COMEDOR_URL" => $FOTO_SALA_COMEDOR_URL,
        "FOTO_PERFIL_URL" => $FOTO_PERFIL_URL,
        "FOTO_FACHADA_URL" => $FOTO_FACHADA_URL,
        "ADJUNTOS_VISITA_JSON" => $allAdj,
      ],
      "EVIDENCIA_VIDEOLLAMADA" => $EVIDENCIA_VIDEOLLAMADA,
      "CONSULTA_ANTECEDENTES_VISITA" => $CONSULTA_ANTECEDENTES_VISITA
    ]);
  } else {
    // ================= INSERT =================
    $sqlIn = "INSERT INTO ESTUDIO_ARCHIVOS_EVIDENCIAS (
                ID_ESTUDIO,
                ID_CANDIDATO_EMPRESA,
                FOTO_FAMILIAR_URL,
                FOTO_SALA_COMEDOR_URL,
                FOTO_PERFIL_URL,
                FOTO_FACHADA_URL,
                ADJUNTOS_VISITA_JSON,
                EVIDENCIA_VIDEOLLAMADA,
                CONSULTA_ANTECEDENTES_VISITA,
                USUARIO_CREA,
                FECHA_CREACION,
                ESTADO_REGISTRO
              ) VALUES (
                ?, ?,
                ?, ?, ?, ?,
                ?, ?, ?,
                ?, NOW(), 1
              )";

    $stmt = $mysqli->prepare($sqlIn);
    if (!$stmt) throw new Exception("Error prepare INSERT: " . $mysqli->error);

    // 2 ints + 7 strings + 1 int = 10
    $stmt->bind_param(
      "iissssssssi",
      $ID_ESTUDIO,
      $ID_CANDIDATO_EMPRESA,
      $FOTO_FAMILIAR_URL,
      $FOTO_SALA_COMEDOR_URL,
      $FOTO_PERFIL_URL,
      $FOTO_FACHADA_URL,
      $ADJUNTOS_VISITA_JSON,
      $EVIDENCIA_VIDEOLLAMADA,
      $CONSULTA_ANTECEDENTES_VISITA,
      $USUARIO
    );

    if (!$stmt->execute()) throw new Exception("Error execute INSERT: " . $stmt->error);
    $stmt->close();

    respond(true, "Archivos/Evidencias guardados", [
      "accion" => "insert",
      "ID_ESTUDIO" => $ID_ESTUDIO,
      "urls" => [
        "FOTO_FAMILIAR_URL" => $FOTO_FAMILIAR_URL,
        "FOTO_SALA_COMEDOR_URL" => $FOTO_SALA_COMEDOR_URL,
        "FOTO_PERFIL_URL" => $FOTO_PERFIL_URL,
        "FOTO_FACHADA_URL" => $FOTO_FACHADA_URL,
        "ADJUNTOS_VISITA_JSON" => $allAdj,
      ],
      "EVIDENCIA_VIDEOLLAMADA" => $EVIDENCIA_VIDEOLLAMADA,
      "CONSULTA_ANTECEDENTES_VISITA" => $CONSULTA_ANTECEDENTES_VISITA
    ]);
  }

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