-- Migración 2026: roles avanzados y permisos por recurso
-- Crea tabla de recursos, permisos por rol y por usuario a nivel de recurso,
-- añade columna activo a roles y migra los permisos existentes.

START TRANSACTION;

-- Roles: columna activo (por si no existe)
ALTER TABLE roles
    ADD COLUMN IF NOT EXISTS activo TINYINT(1) NOT NULL DEFAULT 1 AFTER descripcion;

-- Usuarios: rol_id ya existe en la mayoría de instalaciones; si no, lo añadimos.
ALTER TABLE usuarios
    ADD COLUMN IF NOT EXISTS rol_id INT NULL AFTER usuario;

-- Tabla de recursos (granularidad por sección)
CREATE TABLE IF NOT EXISTS recursos (
    id INT AUTO_INCREMENT PRIMARY KEY,
    clave VARCHAR(100) NOT NULL UNIQUE,
    nombre VARCHAR(200) NOT NULL,
    categoria VARCHAR(100) DEFAULT 'General',
    orden INT NOT NULL DEFAULT 0,
    activo TINYINT(1) NOT NULL DEFAULT 1,
    creado_en TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- Permisos por rol y recurso
CREATE TABLE IF NOT EXISTS permisos_rol_recurso (
    id INT AUTO_INCREMENT PRIMARY KEY,
    rol_id INT NOT NULL,
    recurso_id INT NOT NULL,
    puede_ver TINYINT(1) NOT NULL DEFAULT 0,
    puede_crear TINYINT(1) NOT NULL DEFAULT 0,
    puede_editar TINYINT(1) NOT NULL DEFAULT 0,
    puede_borrar TINYINT(1) NOT NULL DEFAULT 0,
    puede_exportar TINYINT(1) NOT NULL DEFAULT 0,
    UNIQUE KEY uk_perm_rol_recurso (rol_id, recurso_id),
    CONSTRAINT fk_perm_rol_rec_rol FOREIGN KEY (rol_id) REFERENCES roles(id),
    CONSTRAINT fk_perm_rol_rec_recurso FOREIGN KEY (recurso_id) REFERENCES recursos(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- Permisos por usuario y recurso (override de rol)
CREATE TABLE IF NOT EXISTS permisos_usuario_recurso (
    id INT AUTO_INCREMENT PRIMARY KEY,
    usuario_id INT NOT NULL,
    recurso_id INT NOT NULL,
    puede_ver TINYINT(1) NOT NULL DEFAULT 0,
    puede_crear TINYINT(1) NOT NULL DEFAULT 0,
    puede_editar TINYINT(1) NOT NULL DEFAULT 0,
    puede_borrar TINYINT(1) NOT NULL DEFAULT 0,
    puede_exportar TINYINT(1) NOT NULL DEFAULT 0,
    UNIQUE KEY uk_perm_user_recurso (usuario_id, recurso_id),
    CONSTRAINT fk_perm_user_rec_user FOREIGN KEY (usuario_id) REFERENCES usuarios(id),
    CONSTRAINT fk_perm_user_rec_recurso FOREIGN KEY (recurso_id) REFERENCES recursos(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- Sembrar recursos desde los módulos existentes (forzando misma intercalación)
INSERT INTO recursos (clave, nombre, categoria, orden, activo)
SELECT m.clave, m.nombre,
       CASE
           WHEN m.clave LIKE 'ADMIN%' THEN 'Administración'
           WHEN m.clave LIKE 'FINANZAS%' THEN 'Finanzas'
           WHEN m.clave LIKE 'ALMACEN%' THEN 'Almacén'
           ELSE 'General'
       END AS categoria,
       m.id AS orden,
       m.activo
FROM modulos m
WHERE NOT EXISTS (
    SELECT 1 FROM recursos r
    WHERE r.clave COLLATE utf8mb4_unicode_ci = m.clave COLLATE utf8mb4_unicode_ci
);

-- Recursos adicionales útiles
INSERT IGNORE INTO recursos (clave, nombre, categoria, orden, activo) VALUES
('ADMIN_PERMISOS', 'Administración de permisos', 'Administración', 12, 1),
('ADMIN_ROLES', 'Administración de roles', 'Administración', 13, 1),
('FINANZAS_PRESUPUESTOS', 'Finanzas - Presupuestos', 'Finanzas', 120, 1),
('FINANZAS_CATALOGO', 'Finanzas - Catálogo presupuestos', 'Finanzas', 130, 1),
('ALMACEN_ARTICULOS', 'Almacén - Artículos', 'Almacén', 210, 1),
('ALMACEN_CONTENEDORES', 'Almacén - Contenedores', 'Almacén', 220, 1),
('ALMACEN_BUSCAR', 'Almacén - Buscar código', 'Almacén', 230, 1);

-- Migrar permisos de rol desde permisos_modulos_rol
INSERT INTO permisos_rol_recurso (rol_id, recurso_id, puede_ver, puede_crear, puede_editar, puede_borrar, puede_exportar)
SELECT pr.rol_id, r.id, pr.puede_ver, pr.puede_crear, pr.puede_editar, pr.puede_borrar, pr.puede_exportar
FROM permisos_modulos_rol pr
JOIN modulos m   ON pr.modulo_id = m.id
JOIN recursos r  ON r.clave COLLATE utf8mb4_unicode_ci = m.clave COLLATE utf8mb4_unicode_ci
ON DUPLICATE KEY UPDATE
    puede_ver      = VALUES(puede_ver),
    puede_crear    = VALUES(puede_crear),
    puede_editar   = VALUES(puede_editar),
    puede_borrar   = VALUES(puede_borrar),
    puede_exportar = VALUES(puede_exportar);

-- Migrar permisos de usuario desde permisos_usuario_modulo
INSERT INTO permisos_usuario_recurso (usuario_id, recurso_id, puede_ver, puede_crear, puede_editar, puede_borrar, puede_exportar)
SELECT pu.usuario_id, r.id, pu.puede_ver, pu.puede_crear, pu.puede_editar, pu.puede_borrar, pu.puede_exportar
FROM permisos_usuario_modulo pu
JOIN modulos m   ON pu.modulo_id = m.id
JOIN recursos r  ON r.clave COLLATE utf8mb4_unicode_ci = m.clave COLLATE utf8mb4_unicode_ci
ON DUPLICATE KEY UPDATE
    puede_ver      = VALUES(puede_ver),
    puede_crear    = VALUES(puede_crear),
    puede_editar   = VALUES(puede_editar),
    puede_borrar   = VALUES(puede_borrar),
    puede_exportar = VALUES(puede_exportar);

COMMIT;
