<?php
declare(strict_types=1);

require_once __DIR__ . '/../../conexion.php';
require_once __DIR__ . '/../../_helpers.php';
require_once __DIR__ . '/../../auth/guard.php';

$u = require_login();
require_admin($u);

$in = read_input();

$id    = isset($in['id']) ? (int)$in['id'] : 0;
$nombre = trim((string)($in['nombre_sectorizacion'] ?? ''));
$color  = trim((string)($in['color_sector'] ?? ''));

if ($nombre === '') {
  json_response(["ok" => false, "message" => "Nombre de sectorización es obligatorio."], 400);
}
if ($color !== '' && !preg_match('/^#([0-9a-fA-F]{6})$/', $color)) {
  json_response(["ok" => false, "message" => "Color inválido. Usa formato #RRGGBB."], 400);
}

// ✅ registrado_por con FK a funcionario(rut)
// -> normaliza y valida existencia, si no existe => NULL (evita 500 por FK)
$registrado_por = $u['rut'] ?? null;
$registrado_por = $registrado_por ? normalize_rut((string)$registrado_por) : null;

if ($registrado_por) {
  $chk = $pdo->prepare("SELECT COUNT(*) FROM funcionario WHERE rut = ?");
  $chk->execute([$registrado_por]);
  if ((int)$chk->fetchColumn() === 0) {
    $registrado_por = null;
  }
}

try {
  if ($id > 0) {
    $stmt = $pdo->prepare("
      UPDATE sectorizacion
      SET nombre_sectorizacion = ?, color_sector = ?, registrado_por = ?
      WHERE id = ?
    ");
    $stmt->execute([$nombre, ($color ?: null), $registrado_por, $id]);
  } else {
    $stmt = $pdo->prepare("
      INSERT INTO sectorizacion (nombre_sectorizacion, color_sector, registrado_por)
      VALUES (?, ?, ?)
    ");
    $stmt->execute([$nombre, ($color ?: null), $registrado_por]);
    $id = (int)$pdo->lastInsertId();
  }

  fp_log_activity($pdo, $u, 'Configuración', 'Guardar sectorización', 'Se guardó/actualizó la sectorización ' . $nombre, 'sectorizacion', (string)$id);

  json_response(["ok" => true, "data" => ["id" => $id]]);
} catch (Throwable $e) {
  if ($e instanceof PDOException) {
    $code = (int)($e->errorInfo[1] ?? 0);

    // UNIQUE duplicado
    if ($code === 1062) {
      json_response(["ok" => false, "message" => "Ya existe una sectorización con ese nombre."], 409);
    }

    // FK (registrado_por inválido, o relaciones)
    if ($code === 1452) {
      json_response(["ok" => false, "message" => "No se pudo guardar: registrado_por no válido (FK)."], 409);
    }
  }

  error_log("SECTORIZACION SAVE ERROR: " . $e->getMessage());
  json_response(["ok" => false, "message" => "Error guardando sectorización."], 500);
}
