<?php
declare(strict_types=1);

require_once __DIR__ . '/../conexion.php'; // <- aquí queda $pdo
// Si tu conexion.php ya imprime JSON en error, perfecto.

ini_set('display_errors', '0');
ini_set('log_errors', '1');
error_reporting(E_ALL);

function json_response(array $payload, int $status = 200): never {
  http_response_code($status);
  header('Content-Type: application/json; charset=utf-8');
  header('Cache-Control: no-store, no-cache, must-revalidate, max-age=0');
  echo json_encode($payload, JSON_UNESCAPED_UNICODE);
  exit;
}

function normalize_rut(string $rut): string {
  $rut = strtoupper(trim($rut));
  $rut = str_replace([".", "-", " "], "", $rut);
  return $rut;
}

function normalize_role_login(string $rol): string {
  $rol = strtolower(trim($rol));
  $rol = str_replace(['_', ' '], '-', $rol);

  if (in_array($rol, ['admin', 'administrador'], true)) return 'administrador';
  if ($rol === 'digitador') return 'digitador';
  if (in_array($rol, ['digitador-terreno', 'terreno'], true)) return 'digitador-terreno';
  if (in_array($rol, ['monitor', 'lectura', 'solo-lectura', 'readonly', 'read-only'], true)) return 'monitor';

  // Compatibilidad con roles antiguos.
  if ($rol === 'supervisor') return 'digitador';

  return 'digitador';
}



function log_login_activity(PDO $pdo, array $user): void {
  try {
    $pdo->exec("CREATE TABLE IF NOT EXISTS `actividad_reciente` (
      `id` BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT,
      `funcionario_rut` VARCHAR(15) DEFAULT NULL,
      `funcionario_nombre` VARCHAR(180) DEFAULT NULL,
      `rol_funcionario` VARCHAR(50) DEFAULT NULL,
      `modulo` VARCHAR(80) NOT NULL,
      `accion` VARCHAR(80) NOT NULL,
      `descripcion` VARCHAR(255) NOT NULL,
      `entidad_tipo` VARCHAR(80) DEFAULT NULL,
      `entidad_id` VARCHAR(80) DEFAULT NULL,
      `ip` VARCHAR(45) DEFAULT NULL,
      `user_agent` VARCHAR(255) DEFAULT NULL,
      `fecha_registro` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
      PRIMARY KEY (`id`),
      KEY `idx_actividad_funcionario_fecha` (`funcionario_rut`, `fecha_registro`),
      KEY `idx_actividad_fecha` (`fecha_registro`),
      KEY `idx_actividad_modulo` (`modulo`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci");

    $st = $pdo->prepare("INSERT INTO actividad_reciente
      (funcionario_rut, funcionario_nombre, rol_funcionario, modulo, accion, descripcion, entidad_tipo, entidad_id, ip, user_agent)
      VALUES (?, ?, ?, 'Acceso', 'Inicio de sesión', 'El usuario inició sesión en la plataforma.', 'sesion', ?, ?, ?)");
    $rut = normalize_rut((string)($user['rut'] ?? ''));
    $st->execute([
      $rut ?: null,
      substr((string)($user['nombre'] ?? 'Usuario'), 0, 180),
      substr((string)($user['rol'] ?? ''), 0, 50),
      $rut ?: null,
      substr((string)($_SERVER['REMOTE_ADDR'] ?? ''), 0, 45),
      substr((string)($_SERVER['HTTP_USER_AGENT'] ?? ''), 0, 255),
    ]);
  } catch (Throwable $e) {
    error_log('LOGIN ACTIVITY ERROR: ' . $e->getMessage());
  }
}

function start_fp_session(): void {
  if (session_status() === PHP_SESSION_ACTIVE) return;

  $secure = (!empty($_SERVER["HTTPS"]) && $_SERVER["HTTPS"] !== "off");
  session_set_cookie_params([
    "lifetime" => 0,
    "path" => "/",
    "secure" => $secure,
    "httponly" => true,
    "samesite" => "Lax",
  ]);
  session_start();
}

if (($_SERVER['REQUEST_METHOD'] ?? 'GET') !== 'POST') {
  json_response(["ok" => false, "message" => "Método no permitido."], 405);
}

$raw = file_get_contents('php://input') ?: '';
$in = json_decode($raw, true);
if (!is_array($in)) $in = [];

$rut = normalize_rut((string)($in['rut'] ?? ''));
$clave = (string)($in['clave'] ?? '');

if ($rut === '' || trim($clave) === '') {
  json_response(["ok" => false, "message" => "Ingresa RUT y clave."], 400);
}

try {
  $stmt = $pdo->prepare("
    SELECT rut, nombre, rol_funcionario, clave
    FROM funcionario
    WHERE rut = ?
    LIMIT 1
  ");
  $stmt->execute([$rut]);
  $row = $stmt->fetch();

  if (!$row) {
    json_response(["ok" => false, "message" => "Credenciales inválidas."], 401);
  }

  $stored = (string)($row['clave'] ?? '');
  if ($stored === '') {
    json_response(["ok" => false, "message" => "Usuario sin clave registrada."], 401);
  }

  // Soporta hash o texto plano
  $info = password_get_info($stored);
  $isHash = (($info['algo'] ?? 0) !== 0);

  $valid = $isHash ? password_verify($clave, $stored) : hash_equals($stored, $clave);

  if (!$valid) {
    json_response(["ok" => false, "message" => "Credenciales inválidas."], 401);
  }

  // Auto-upgrade: si estaba en texto plano, la deja hasheada
  if (!$isHash) {
    $newHash = password_hash($clave, PASSWORD_DEFAULT);
    $u = $pdo->prepare("UPDATE funcionario SET clave = ? WHERE rut = ? LIMIT 1");
    $u->execute([$newHash, $rut]);
  } else if (password_needs_rehash($stored, PASSWORD_DEFAULT)) {
    $newHash = password_hash($clave, PASSWORD_DEFAULT);
    $u = $pdo->prepare("UPDATE funcionario SET clave = ? WHERE rut = ? LIMIT 1");
    $u->execute([$newHash, $rut]);
  }

  start_fp_session();
  session_regenerate_id(true);

  $user = [
    "rut" => (string)$row["rut"],
    "nombre" => (string)($row["nombre"] ?? "Funcionario/a"),
    "rol" => normalize_role_login((string)($row["rol_funcionario"] ?? "digitador")),
  ];

  $_SESSION["fp_user"] = $user;

  log_login_activity($pdo, $user);

  json_response(["ok" => true, "user" => $user], 200);

} catch (Throwable $e) {
  error_log("LOGIN ERROR: " . $e->getMessage());
  json_response(["ok" => false, "message" => "Error del servidor."], 500);
}
