<?php
/**
 * POST /api/lab/save_lab_user.php
 * Crea o actualiza un usuario del sistema.
 * Solo admins.
 *
 * Body JSON:
 *   { id?, username, full_name, email?, password?, role_id, is_active?, enfermera_id? }
 */
require_once __DIR__ . '/_helpers.php';
requireMethod('POST');
requireAdmin();

$body        = inputJson();
$id          = isset($body['id'])  ? (int)$body['id'] : null;
$username    = trim($body['username']   ?? '');
$fullName    = trim($body['full_name']  ?? '');
$email       = trim($body['email']      ?? '');
$password    = $body['password']        ?? '';
$roleId      = isset($body['role_id'])  ? (int)$body['role_id'] : null;
$isActive    = isset($body['is_active']) ? (int)(bool)$body['is_active'] : 1;
$enfermeraId = isset($body['enfermera_id']) && $body['enfermera_id'] !== '' && $body['enfermera_id'] !== null
               ? (int)$body['enfermera_id'] : null;

if (!$username) jsonError('El nombre de usuario es obligatorio');
if (!$fullName) jsonError('El nombre completo es obligatorio');
if (!$roleId)   jsonError('Debes seleccionar un rol');

// Validar username (solo alfanumérico + guión bajo)
if (!preg_match('/^[a-zA-Z0-9_\.]{3,50}$/', $username)) {
    jsonError('El username solo puede tener letras, números, puntos y guiones bajos (3-50 caracteres)');
}

$db = Database::getInstance();

// Obtener slug del rol
$role = $db->fetch("SELECT id, slug FROM roles WHERE id = ?", [$roleId]);
if (!$role) jsonError('Rol no encontrado', 404);
$roleSlug = $role['slug'];

// Si el rol es enfermero y no hay enfermera_id, buscar si tiene ya uno vinculado
// (se puede crear sin vincular y vincularlo después desde la pantalla de Enfermeras)

if ($id) {
    // ── Actualizar ──────────────────────────────────────────
    $existing = $db->fetch("SELECT id, username FROM admin_users WHERE id = ?", [$id]);
    if (!$existing) jsonError('Usuario no encontrado', 404);

    // Verificar duplicado de username (excluir el propio)
    $dup = $db->fetch("SELECT id FROM admin_users WHERE username = ? AND id != ?", [$username, $id]);
    if ($dup) jsonError('Ese nombre de usuario ya está en uso');

    $params = [$username, $fullName, $email ?: null, $roleId, $roleSlug, $isActive, $enfermeraId, $id];
    $sql    = "UPDATE admin_users
               SET username=?, full_name=?, email=?, role_id=?, role=?, is_active=?, enfermera_id=?, updated_at=NOW()
               WHERE id=?";

    if ($password) {
        if (strlen($password) < 6) jsonError('La contraseña debe tener al menos 6 caracteres');
        $hash   = password_hash($password, PASSWORD_BCRYPT);
        $sql    = "UPDATE admin_users
                   SET username=?, full_name=?, email=?, role_id=?, role=?, is_active=?, enfermera_id=?, password_hash=?, updated_at=NOW()
                   WHERE id=?";
        $params = [$username, $fullName, $email ?: null, $roleId, $roleSlug, $isActive, $enfermeraId, $hash, $id];
    }

    $db->query($sql, $params);
    jsonOk(['id' => $id], 'Usuario actualizado correctamente');

} else {
    // ── Crear ────────────────────────────────────────────────
    if (!$password) jsonError('La contraseña es obligatoria al crear un usuario');
    if (strlen($password) < 6) jsonError('La contraseña debe tener al menos 6 caracteres');

    $dup = $db->fetch("SELECT id FROM admin_users WHERE username = ?", [$username]);
    if ($dup) jsonError('Ese nombre de usuario ya está en uso');

    $hash = password_hash($password, PASSWORD_BCRYPT);

    $db->query(
        "INSERT INTO admin_users (username, full_name, email, password_hash, role_id, role, is_active, enfermera_id)
         VALUES (?,?,?,?,?,?,?,?)",
        [$username, $fullName, $email ?: null, $hash, $roleId, $roleSlug, $isActive, $enfermeraId]
    );
    $newId = $db->lastInsertId();
    jsonOk(['id' => $newId], 'Usuario creado correctamente');
}
