<?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();

$rut = normalize_rut((string)($in['rut'] ?? ''));
$apellido_paterno = trim((string)($in['apellido_paterno'] ?? ''));
$apellido_materno = trim((string)($in['apellido_materno'] ?? ''));
$nombre = trim((string)($in['nombre'] ?? ''));
$correo = trim((string)($in['correo_electronico'] ?? ''));
$celular = trim((string)($in['celular'] ?? ''));
$rolRaw = strtolower(trim((string)($in['rol_funcionario'] ?? '')));
$rolKey = str_replace(['_', ' '], '-', $rolRaw);
$rolValido = in_array($rolKey, [
  'admin', 'administrador',
  'digitador',
  'digitador-terreno', 'terreno',
  'monitor', 'lectura', 'solo-lectura', 'readonly', 'read-only',
  'supervisor'
], true);
$rol = normalize_role($rolRaw);
$clave = (string)($in['clave'] ?? '');

if ($rut === '') json_response(["ok" => false, "message" => "RUT es obligatorio."], 400);
if ($nombre === '') json_response(["ok" => false, "message" => "Nombre es obligatorio."], 400);
if ($rolRaw === '') json_response(["ok" => false, "message" => "Rol es obligatorio."], 400);
if (!$rolValido || !in_array($rol, ['administrador', 'digitador', 'digitador-terreno', 'monitor'], true)) {
  json_response(["ok" => false, "message" => "Rol inválido. Usa administrador, digitador, digitador-terreno o monitor."], 400);
}

try {
  // ¿Existe?
  $chk = $pdo->prepare("SELECT COUNT(*) FROM funcionario WHERE rut = ?");
  $chk->execute([$rut]);
  $existe = ((int)$chk->fetchColumn() > 0);

  if ($existe) {
    if (trim($clave) !== '') {
      $hash = password_hash(trim($clave), PASSWORD_BCRYPT);
      $stmt = $pdo->prepare("
        UPDATE funcionario
        SET apellido_paterno=?, apellido_materno=?, nombre=?, correo_electronico=?, celular=?, rol_funcionario=?, clave=?
        WHERE rut=?
      ");
      $stmt->execute([$apellido_paterno, $apellido_materno, $nombre, $correo, $celular, $rol, $hash, $rut]);
    } else {
      $stmt = $pdo->prepare("
        UPDATE funcionario
        SET apellido_paterno=?, apellido_materno=?, nombre=?, correo_electronico=?, celular=?, rol_funcionario=?
        WHERE rut=?
      ");
      $stmt->execute([$apellido_paterno, $apellido_materno, $nombre, $correo, $celular, $rol, $rut]);
    }
  } else {
    if (trim($clave) === '') {
      json_response(["ok" => false, "message" => "Para crear un funcionario nuevo debes ingresar clave."], 400);
    }
    $hash = password_hash(trim($clave), PASSWORD_BCRYPT);

    $stmt = $pdo->prepare("
      INSERT INTO funcionario (rut, apellido_paterno, apellido_materno, nombre, correo_electronico, celular, rol_funcionario, clave)
      VALUES (?, ?, ?, ?, ?, ?, ?, ?)
    ");
    $stmt->execute([$rut, $apellido_paterno, $apellido_materno, $nombre, $correo, $celular, $rol, $hash]);
  }

  fp_log_activity($pdo, $u, 'Configuración', 'Guardar funcionario', 'Se guardó/actualizó el funcionario RUT ' . $rut, 'funcionario', $rut);

  json_response(["ok" => true]);
} catch (Throwable $e) {
  error_log("FUNCIONARIOS SAVE ERROR: ".$e->getMessage());
  json_response(["ok" => false, "message" => "Error guardando funcionario."], 500);
}
