-- =====================================================
-- SISTEMA DE MÓDULOS Y PERMISOS
-- Ejecutar en phpMyAdmin
-- =====================================================

-- 1. TABLA MÓDULOS
CREATE TABLE IF NOT EXISTS modulos (
    id_modulo INT AUTO_INCREMENT PRIMARY KEY,
    codigo VARCHAR(50) NOT NULL UNIQUE,
    nombre VARCHAR(100) NOT NULL,
    descripcion VARCHAR(255) NULL,
    icono VARCHAR(50) DEFAULT 'bi-folder',
    ruta VARCHAR(100) NULL,
    orden INT DEFAULT 0,
    es_menu TINYINT(1) DEFAULT 1 COMMENT '1=Mostrar en menú, 0=Solo interno',
    id_modulo_padre INT NULL,
    estado TINYINT(1) DEFAULT 1,
    fecha_creacion TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (id_modulo_padre) REFERENCES modulos(id_modulo) ON DELETE SET NULL,
    INDEX idx_codigo (codigo),
    INDEX idx_orden (orden),
    INDEX idx_estado (estado)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- 2. TABLA PERMISOS
CREATE TABLE IF NOT EXISTS permisos (
    id_permiso INT AUTO_INCREMENT PRIMARY KEY,
    id_modulo INT NOT NULL,
    codigo VARCHAR(100) NOT NULL UNIQUE,
    nombre VARCHAR(100) NOT NULL,
    descripcion VARCHAR(255) NULL,
    tipo_permiso ENUM('ver', 'crear', 'editar', 'eliminar', 'exportar', 'importar', 'especial') DEFAULT 'ver',
    estado TINYINT(1) DEFAULT 1,
    fecha_creacion TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (id_modulo) REFERENCES modulos(id_modulo) ON DELETE CASCADE,
    INDEX idx_modulo (id_modulo),
    INDEX idx_tipo (tipo_permiso)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- 3. TABLA ROLES_PERMISOS (relación muchos a muchos)
CREATE TABLE IF NOT EXISTS roles_permisos (
    id_rol_permiso INT AUTO_INCREMENT PRIMARY KEY,
    id_rol INT NOT NULL,
    id_permiso INT NOT NULL,
    fecha_asignacion TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (id_rol) REFERENCES roles(id_rol) ON DELETE CASCADE,
    FOREIGN KEY (id_permiso) REFERENCES permisos(id_permiso) ON DELETE CASCADE,
    UNIQUE KEY uk_rol_permiso (id_rol, id_permiso)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- =====================================================
-- INSERTAR MÓDULOS DEL SISTEMA
-- =====================================================

INSERT INTO modulos (codigo, nombre, descripcion, icono, ruta, orden, es_menu) VALUES
-- Módulos principales
('dashboard', 'Dashboard', 'Panel principal del sistema', 'bi-speedometer2', 'dashboard', 1, 1),
('productos', 'Productos', 'Gestión de productos', 'bi-box-seam', 'productos', 10, 1),
('ventas', 'Ventas', 'Módulo de ventas', 'bi-cart-check', 'ventas', 20, 1),
('compras', 'Compras', 'Módulo de compras e ingresos', 'bi-cart-plus', 'ingresos', 30, 1),
('inventario', 'Inventario', 'Gestión de inventario', 'bi-clipboard-data', 'kardex', 40, 1),
('clientes', 'Clientes', 'Gestión de clientes', 'bi-people', 'clientes', 50, 1),
('proveedores', 'Proveedores', 'Gestión de proveedores', 'bi-truck', 'proveedores', 60, 1),
('caja', 'Caja', 'Gestión de caja', 'bi-cash-stack', 'cajas', 70, 1),
('reportes', 'Reportes', 'Reportes del sistema', 'bi-graph-up', 'reportes', 80, 1),

-- Maestros (submódulos)
('categorias', 'Categorías', 'Gestión de categorías', 'bi-tags', 'categorias', 100, 1),
('marcas', 'Marcas', 'Gestión de marcas', 'bi-award', 'marcas', 101, 1),
('unidades', 'Unidades de Medida', 'Gestión de unidades', 'bi-rulers', 'unidades', 102, 1),
('almacenes', 'Almacenes', 'Gestión de almacenes', 'bi-building', 'almacenes', 103, 1),

-- Configuración
('usuarios', 'Usuarios', 'Gestión de usuarios', 'bi-person-badge', 'usuarios', 200, 1),
('roles', 'Roles', 'Gestión de roles', 'bi-shield-lock', 'roles', 201, 1),
('modulos', 'Módulos', 'Gestión de módulos del sistema', 'bi-grid', 'modulos', 202, 1),
('permisos', 'Permisos', 'Gestión de permisos', 'bi-key', 'permisos', 203, 1),
('empresa', 'Empresa', 'Configuración de empresa', 'bi-gear', 'empresa', 210, 1),

-- Otros módulos
('transferencias', 'Transferencias', 'Transferencias entre almacenes', 'bi-arrow-left-right', 'transferencias', 45, 1),
('inventario_fisico', 'Inventario Físico', 'Conteo de inventario físico', 'bi-clipboard-check', 'inventarios', 46, 1);

-- =====================================================
-- INSERTAR PERMISOS PARA CADA MÓDULO
-- =====================================================

-- Función para insertar permisos estándar por módulo
-- Permisos para Dashboard
INSERT INTO permisos (id_modulo, codigo, nombre, tipo_permiso) VALUES
((SELECT id_modulo FROM modulos WHERE codigo = 'dashboard'), 'dashboard.ver', 'Ver Dashboard', 'ver');

-- Permisos para Productos
INSERT INTO permisos (id_modulo, codigo, nombre, tipo_permiso) VALUES
((SELECT id_modulo FROM modulos WHERE codigo = 'productos'), 'productos.ver', 'Ver Productos', 'ver'),
((SELECT id_modulo FROM modulos WHERE codigo = 'productos'), 'productos.crear', 'Crear Productos', 'crear'),
((SELECT id_modulo FROM modulos WHERE codigo = 'productos'), 'productos.editar', 'Editar Productos', 'editar'),
((SELECT id_modulo FROM modulos WHERE codigo = 'productos'), 'productos.eliminar', 'Eliminar Productos', 'eliminar'),
((SELECT id_modulo FROM modulos WHERE codigo = 'productos'), 'productos.exportar', 'Exportar Productos', 'exportar');

-- Permisos para Ventas
INSERT INTO permisos (id_modulo, codigo, nombre, tipo_permiso) VALUES
((SELECT id_modulo FROM modulos WHERE codigo = 'ventas'), 'ventas.ver', 'Ver Ventas', 'ver'),
((SELECT id_modulo FROM modulos WHERE codigo = 'ventas'), 'ventas.crear', 'Crear Ventas', 'crear'),
((SELECT id_modulo FROM modulos WHERE codigo = 'ventas'), 'ventas.anular', 'Anular Ventas', 'especial'),
((SELECT id_modulo FROM modulos WHERE codigo = 'ventas'), 'ventas.imprimir', 'Imprimir Ventas', 'especial'),
((SELECT id_modulo FROM modulos WHERE codigo = 'ventas'), 'ventas.exportar', 'Exportar Ventas', 'exportar');

-- Permisos para Compras
INSERT INTO permisos (id_modulo, codigo, nombre, tipo_permiso) VALUES
((SELECT id_modulo FROM modulos WHERE codigo = 'compras'), 'compras.ver', 'Ver Compras/Ingresos', 'ver'),
((SELECT id_modulo FROM modulos WHERE codigo = 'compras'), 'compras.crear', 'Crear Compras/Ingresos', 'crear'),
((SELECT id_modulo FROM modulos WHERE codigo = 'compras'), 'compras.editar', 'Editar Compras', 'editar'),
((SELECT id_modulo FROM modulos WHERE codigo = 'compras'), 'compras.eliminar', 'Eliminar Compras', 'eliminar');

-- Permisos para Inventario/Kardex
INSERT INTO permisos (id_modulo, codigo, nombre, tipo_permiso) VALUES
((SELECT id_modulo FROM modulos WHERE codigo = 'inventario'), 'inventario.ver', 'Ver Kardex', 'ver'),
((SELECT id_modulo FROM modulos WHERE codigo = 'inventario'), 'inventario.ajustar', 'Realizar Ajustes', 'especial'),
((SELECT id_modulo FROM modulos WHERE codigo = 'inventario'), 'inventario.exportar', 'Exportar Kardex', 'exportar');

-- Permisos para Clientes
INSERT INTO permisos (id_modulo, codigo, nombre, tipo_permiso) VALUES
((SELECT id_modulo FROM modulos WHERE codigo = 'clientes'), 'clientes.ver', 'Ver Clientes', 'ver'),
((SELECT id_modulo FROM modulos WHERE codigo = 'clientes'), 'clientes.crear', 'Crear Clientes', 'crear'),
((SELECT id_modulo FROM modulos WHERE codigo = 'clientes'), 'clientes.editar', 'Editar Clientes', 'editar'),
((SELECT id_modulo FROM modulos WHERE codigo = 'clientes'), 'clientes.eliminar', 'Eliminar Clientes', 'eliminar');

-- Permisos para Proveedores
INSERT INTO permisos (id_modulo, codigo, nombre, tipo_permiso) VALUES
((SELECT id_modulo FROM modulos WHERE codigo = 'proveedores'), 'proveedores.ver', 'Ver Proveedores', 'ver'),
((SELECT id_modulo FROM modulos WHERE codigo = 'proveedores'), 'proveedores.crear', 'Crear Proveedores', 'crear'),
((SELECT id_modulo FROM modulos WHERE codigo = 'proveedores'), 'proveedores.editar', 'Editar Proveedores', 'editar'),
((SELECT id_modulo FROM modulos WHERE codigo = 'proveedores'), 'proveedores.eliminar', 'Eliminar Proveedores', 'eliminar');

-- Permisos para Caja
INSERT INTO permisos (id_modulo, codigo, nombre, tipo_permiso) VALUES
((SELECT id_modulo FROM modulos WHERE codigo = 'caja'), 'caja.ver', 'Ver Cajas', 'ver'),
((SELECT id_modulo FROM modulos WHERE codigo = 'caja'), 'caja.abrir', 'Abrir Caja', 'especial'),
((SELECT id_modulo FROM modulos WHERE codigo = 'caja'), 'caja.cerrar', 'Cerrar Caja', 'especial'),
((SELECT id_modulo FROM modulos WHERE codigo = 'caja'), 'caja.arqueo', 'Realizar Arqueo', 'especial');

-- Permisos para Reportes
INSERT INTO permisos (id_modulo, codigo, nombre, tipo_permiso) VALUES
((SELECT id_modulo FROM modulos WHERE codigo = 'reportes'), 'reportes.ver', 'Ver Reportes', 'ver'),
((SELECT id_modulo FROM modulos WHERE codigo = 'reportes'), 'reportes.ventas', 'Reporte de Ventas', 'ver'),
((SELECT id_modulo FROM modulos WHERE codigo = 'reportes'), 'reportes.compras', 'Reporte de Compras', 'ver'),
((SELECT id_modulo FROM modulos WHERE codigo = 'reportes'), 'reportes.inventario', 'Reporte de Inventario', 'ver'),
((SELECT id_modulo FROM modulos WHERE codigo = 'reportes'), 'reportes.exportar', 'Exportar Reportes', 'exportar');

-- Permisos para Categorías
INSERT INTO permisos (id_modulo, codigo, nombre, tipo_permiso) VALUES
((SELECT id_modulo FROM modulos WHERE codigo = 'categorias'), 'categorias.ver', 'Ver Categorías', 'ver'),
((SELECT id_modulo FROM modulos WHERE codigo = 'categorias'), 'categorias.crear', 'Crear Categorías', 'crear'),
((SELECT id_modulo FROM modulos WHERE codigo = 'categorias'), 'categorias.editar', 'Editar Categorías', 'editar'),
((SELECT id_modulo FROM modulos WHERE codigo = 'categorias'), 'categorias.eliminar', 'Eliminar Categorías', 'eliminar');

-- Permisos para Marcas
INSERT INTO permisos (id_modulo, codigo, nombre, tipo_permiso) VALUES
((SELECT id_modulo FROM modulos WHERE codigo = 'marcas'), 'marcas.ver', 'Ver Marcas', 'ver'),
((SELECT id_modulo FROM modulos WHERE codigo = 'marcas'), 'marcas.crear', 'Crear Marcas', 'crear'),
((SELECT id_modulo FROM modulos WHERE codigo = 'marcas'), 'marcas.editar', 'Editar Marcas', 'editar'),
((SELECT id_modulo FROM modulos WHERE codigo = 'marcas'), 'marcas.eliminar', 'Eliminar Marcas', 'eliminar');

-- Permisos para Unidades
INSERT INTO permisos (id_modulo, codigo, nombre, tipo_permiso) VALUES
((SELECT id_modulo FROM modulos WHERE codigo = 'unidades'), 'unidades.ver', 'Ver Unidades', 'ver'),
((SELECT id_modulo FROM modulos WHERE codigo = 'unidades'), 'unidades.crear', 'Crear Unidades', 'crear'),
((SELECT id_modulo FROM modulos WHERE codigo = 'unidades'), 'unidades.editar', 'Editar Unidades', 'editar'),
((SELECT id_modulo FROM modulos WHERE codigo = 'unidades'), 'unidades.eliminar', 'Eliminar Unidades', 'eliminar');

-- Permisos para Almacenes
INSERT INTO permisos (id_modulo, codigo, nombre, tipo_permiso) VALUES
((SELECT id_modulo FROM modulos WHERE codigo = 'almacenes'), 'almacenes.ver', 'Ver Almacenes', 'ver'),
((SELECT id_modulo FROM modulos WHERE codigo = 'almacenes'), 'almacenes.crear', 'Crear Almacenes', 'crear'),
((SELECT id_modulo FROM modulos WHERE codigo = 'almacenes'), 'almacenes.editar', 'Editar Almacenes', 'editar'),
((SELECT id_modulo FROM modulos WHERE codigo = 'almacenes'), 'almacenes.eliminar', 'Eliminar Almacenes', 'eliminar');

-- Permisos para Usuarios
INSERT INTO permisos (id_modulo, codigo, nombre, tipo_permiso) VALUES
((SELECT id_modulo FROM modulos WHERE codigo = 'usuarios'), 'usuarios.ver', 'Ver Usuarios', 'ver'),
((SELECT id_modulo FROM modulos WHERE codigo = 'usuarios'), 'usuarios.crear', 'Crear Usuarios', 'crear'),
((SELECT id_modulo FROM modulos WHERE codigo = 'usuarios'), 'usuarios.editar', 'Editar Usuarios', 'editar'),
((SELECT id_modulo FROM modulos WHERE codigo = 'usuarios'), 'usuarios.eliminar', 'Eliminar Usuarios', 'eliminar'),
((SELECT id_modulo FROM modulos WHERE codigo = 'usuarios'), 'usuarios.reset_password', 'Restablecer Contraseña', 'especial');

-- Permisos para Roles
INSERT INTO permisos (id_modulo, codigo, nombre, tipo_permiso) VALUES
((SELECT id_modulo FROM modulos WHERE codigo = 'roles'), 'roles.ver', 'Ver Roles', 'ver'),
((SELECT id_modulo FROM modulos WHERE codigo = 'roles'), 'roles.crear', 'Crear Roles', 'crear'),
((SELECT id_modulo FROM modulos WHERE codigo = 'roles'), 'roles.editar', 'Editar Roles', 'editar'),
((SELECT id_modulo FROM modulos WHERE codigo = 'roles'), 'roles.eliminar', 'Eliminar Roles', 'eliminar'),
((SELECT id_modulo FROM modulos WHERE codigo = 'roles'), 'roles.permisos', 'Asignar Permisos', 'especial');

-- Permisos para Módulos
INSERT INTO permisos (id_modulo, codigo, nombre, tipo_permiso) VALUES
((SELECT id_modulo FROM modulos WHERE codigo = 'modulos'), 'modulos.ver', 'Ver Módulos', 'ver'),
((SELECT id_modulo FROM modulos WHERE codigo = 'modulos'), 'modulos.crear', 'Crear Módulos', 'crear'),
((SELECT id_modulo FROM modulos WHERE codigo = 'modulos'), 'modulos.editar', 'Editar Módulos', 'editar'),
((SELECT id_modulo FROM modulos WHERE codigo = 'modulos'), 'modulos.eliminar', 'Eliminar Módulos', 'eliminar');

-- Permisos para Permisos
INSERT INTO permisos (id_modulo, codigo, nombre, tipo_permiso) VALUES
((SELECT id_modulo FROM modulos WHERE codigo = 'permisos'), 'permisos.ver', 'Ver Permisos', 'ver'),
((SELECT id_modulo FROM modulos WHERE codigo = 'permisos'), 'permisos.crear', 'Crear Permisos', 'crear'),
((SELECT id_modulo FROM modulos WHERE codigo = 'permisos'), 'permisos.editar', 'Editar Permisos', 'editar'),
((SELECT id_modulo FROM modulos WHERE codigo = 'permisos'), 'permisos.eliminar', 'Eliminar Permisos', 'eliminar');

-- Permisos para Empresa
INSERT INTO permisos (id_modulo, codigo, nombre, tipo_permiso) VALUES
((SELECT id_modulo FROM modulos WHERE codigo = 'empresa'), 'empresa.ver', 'Ver Configuración Empresa', 'ver'),
((SELECT id_modulo FROM modulos WHERE codigo = 'empresa'), 'empresa.editar', 'Editar Configuración Empresa', 'editar');

-- Permisos para Transferencias
INSERT INTO permisos (id_modulo, codigo, nombre, tipo_permiso) VALUES
((SELECT id_modulo FROM modulos WHERE codigo = 'transferencias'), 'transferencias.ver', 'Ver Transferencias', 'ver'),
((SELECT id_modulo FROM modulos WHERE codigo = 'transferencias'), 'transferencias.crear', 'Crear Transferencias', 'crear'),
((SELECT id_modulo FROM modulos WHERE codigo = 'transferencias'), 'transferencias.aprobar', 'Aprobar Transferencias', 'especial');

-- Permisos para Inventario Físico
INSERT INTO permisos (id_modulo, codigo, nombre, tipo_permiso) VALUES
((SELECT id_modulo FROM modulos WHERE codigo = 'inventario_fisico'), 'inventario_fisico.ver', 'Ver Inventarios Físicos', 'ver'),
((SELECT id_modulo FROM modulos WHERE codigo = 'inventario_fisico'), 'inventario_fisico.crear', 'Crear Inventario Físico', 'crear'),
((SELECT id_modulo FROM modulos WHERE codigo = 'inventario_fisico'), 'inventario_fisico.aplicar', 'Aplicar Ajustes', 'especial');

-- =====================================================
-- ASIGNAR TODOS LOS PERMISOS AL ROL ADMINISTRADOR
-- =====================================================

-- Obtener el ID del rol Administrador (ajustar según tu BD)
INSERT INTO roles_permisos (id_rol, id_permiso)
SELECT 
    (SELECT id_rol FROM roles WHERE codigo = 'ADMIN' OR nombre LIKE '%Admin%' LIMIT 1),
    id_permiso
FROM permisos
WHERE estado = 1
ON DUPLICATE KEY UPDATE fecha_asignacion = CURRENT_TIMESTAMP;

-- =====================================================
-- VERIFICAR INSTALACIÓN
-- =====================================================
SELECT 'Módulos creados:' AS info, COUNT(*) AS total FROM modulos;
SELECT 'Permisos creados:' AS info, COUNT(*) AS total FROM permisos;
SELECT 'Permisos asignados al Admin:' AS info, COUNT(*) AS total FROM roles_permisos;
