-- ============================================================
-- Migración: Sistema de Roles y Módulos
-- Fecha: 2026-03-04
-- Descripción: Crea tablas roles y role_modules; vincula admin_users
-- ============================================================

-- ── 1. Tabla de roles ────────────────────────────────────────
CREATE TABLE IF NOT EXISTS `roles` (
    `id`          INT(11)       NOT NULL AUTO_INCREMENT,
    `name`        VARCHAR(100)  NOT NULL COMMENT 'Nombre legible del rol',
    `slug`        VARCHAR(50)   NOT NULL COMMENT 'Clave interna (enfermero, admin, …)',
    `description` TEXT          DEFAULT NULL,
    `color`       VARCHAR(20)   DEFAULT '#6c757d' COMMENT 'Color HEX para la UI',
    `is_system`   TINYINT(1)    NOT NULL DEFAULT 0 COMMENT '1 = no se puede eliminar',
    `created_at`  TIMESTAMP     NOT NULL DEFAULT CURRENT_TIMESTAMP,
    `updated_at`  TIMESTAMP     NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    PRIMARY KEY (`id`),
    UNIQUE KEY `uk_slug` (`slug`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ── 2. Tabla de módulos asignados por rol ────────────────────
-- Cada fila «activa» el módulo para ese rol.
CREATE TABLE IF NOT EXISTS `role_modules` (
    `id`          INT(11)       NOT NULL AUTO_INCREMENT,
    `role_id`     INT(11)       NOT NULL,
    `module_slug` VARCHAR(100)  NOT NULL,
    PRIMARY KEY (`id`),
    UNIQUE KEY `uk_role_module` (`role_id`, `module_slug`),
    CONSTRAINT `fk_rm_role` FOREIGN KEY (`role_id`)
        REFERENCES `roles`(`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ── 3. Vincular admin_users con roles ────────────────────────
-- (Se ignora si la columna ya existe - compatible MySQL y MariaDB)
ALTER TABLE `admin_users`
    ADD COLUMN `role_id` INT(11) NULL DEFAULT NULL
        COMMENT 'FK a roles.id';

ALTER TABLE `admin_users`
    ADD INDEX `idx_role_id` (`role_id`);

-- ── 4. Roles del sistema (no borrables) ─────────────────────
INSERT IGNORE INTO `roles` (`id`, `name`, `slug`, `description`, `color`, `is_system`) VALUES
(1, 'Administrador', 'admin',     'Acceso completo a todos los módulos',              '#0d6efd', 1),
(2, 'Enfermero',     'enfermero', 'Solo portal de domicilios asignados y formularios','#6f42c1', 1);

-- ── 5. Módulos para el rol Administrador (todos) ─────────────
INSERT IGNORE INTO `role_modules` (`role_id`, `module_slug`) VALUES
(1, 'whatsapp'),
(1, 'lab_dashboard'),
(1, 'lab_ordenes'),
(1, 'lab_pacientes'),
(1, 'lab_domicilios'),
(1, 'lab_enfermeras'),
(1, 'lab_formularios'),
(1, 'lab_reportes'),
(1, 'lab_configuracion'),
(1, 'usuarios');

-- ── 6. Módulos para el rol Enfermero ────────────────────────
INSERT IGNORE INTO `role_modules` (`role_id`, `module_slug`) VALUES
(2, 'enfermero_portal'),
(2, 'lab_formularios');

-- ── 7. Vincular usuarios existentes con su role_id ───────────
UPDATE `admin_users` SET `role_id` = 1 WHERE `role` = 'admin'     AND `role_id` IS NULL;
UPDATE `admin_users` SET `role_id` = 2 WHERE `role` = 'enfermero' AND `role_id` IS NULL;
-- Si algún usuario no tiene rol asignado, asignarle admin por defecto
UPDATE `admin_users` SET `role_id` = 1 WHERE `role_id` IS NULL;

-- ── 8. FK suave (solo si FK no existe aún) ──────────────────
-- (MariaDB/MySQL no tiene ADD CONSTRAINT IF NOT EXISTS, usamos el IGNORE del INSERT)
-- La FK se omite intencionalmente para no bloquear si ya existe;
-- conéctala manualmente si el motor lo permite:
-- ALTER TABLE admin_users ADD CONSTRAINT fk_au_role FOREIGN KEY (role_id) REFERENCES roles(id);
