<?php
/**
 * POST /api/lab/save_role.php
 * Crea o actualiza un rol y sus módulos.
 * Solo admins.
 *
 * Body JSON:
 *   { id?, name, slug, description?, color?, modules: [slug, ...] }
 */
require_once __DIR__ . '/_helpers.php';
requireMethod('POST');
requireAdmin();

$body = inputJson();

$id          = isset($body['id'])   ? (int)$body['id'] : null;
$name        = trim($body['name']        ?? '');
$slug        = trim($body['slug']        ?? '');
$description = trim($body['description'] ?? '');
$color       = trim($body['color']       ?? '#6c757d');
$home_page   = trim($body['home_page']   ?? '') ?: null;
$modules     = $body['modules'] ?? [];

if (!$name)  jsonError('El nombre del rol es obligatorio');
if (!$slug)  jsonError('El slug del rol es obligatorio');
if (!preg_match('/^[a-z0-9_\-]+$/', $slug)) jsonError('El slug solo puede contener letras minúsculas, números, guiones y guiones bajos');
if (!is_array($modules)) jsonError('modules debe ser un arreglo');

$db = Database::getInstance();

// Verificar duplicado de slug
$existing = $db->fetch("SELECT id, is_system FROM roles WHERE slug = ?", [$slug]);
if ($existing && (!$id || $existing['id'] !== $id)) {
    jsonError('Ya existe un rol con ese slug');
}

if ($id) {
    // Actualizar
    $role = $db->fetch("SELECT id, is_system FROM roles WHERE id = ?", [$id]);
    if (!$role) jsonError('Rol no encontrado', 404);

    $db->query(
        "UPDATE roles SET name=?, slug=?, description=?, color=?, home_page=?, updated_at=NOW() WHERE id=?",
        [$name, $slug, $description, $color, $home_page, $id]
    );
    // Reconstruir módulos solo si no es sistema, o siempre (admin puede editar módulos)
    $db->query("DELETE FROM role_modules WHERE role_id = ?", [$id]);
} else {
    // Crear
    $db->query(
        "INSERT INTO roles (name, slug, description, color, home_page) VALUES (?,?,?,?,?)",
        [$name, $slug, $description, $color, $home_page]
    );
    $id = $db->lastInsertId();
}

// Insertar módulos
foreach ($modules as $mod) {
    $mod = trim((string)$mod);
    if ($mod) {
        $db->query(
            "INSERT IGNORE INTO role_modules (role_id, module_slug) VALUES (?,?)",
            [$id, $mod]
        );
    }
}

jsonOk(['id' => $id], $id ? 'Rol actualizado' : 'Rol creado');
