-- Sistema de Usuarios, Perfiles y Permisos
USE pos_torti;

-- Tabla de permisos (cada permiso representa acceso a un modulo)
CREATE TABLE IF NOT EXISTS permisos (
    id INT AUTO_INCREMENT PRIMARY KEY,
    codigo VARCHAR(50) NOT NULL UNIQUE,
    nombre VARCHAR(100) NOT NULL,
    descripcion VARCHAR(255),
    modulo VARCHAR(50) NOT NULL,
    activo TINYINT(1) DEFAULT 1,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- Tabla de perfiles (roles)
CREATE TABLE IF NOT EXISTS perfiles (
    id INT AUTO_INCREMENT PRIMARY KEY,
    nombre VARCHAR(100) NOT NULL UNIQUE,
    descripcion VARCHAR(255),
    activo TINYINT(1) DEFAULT 1,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- Tabla de relacion perfil-permisos
CREATE TABLE IF NOT EXISTS perfil_permisos (
    id INT AUTO_INCREMENT PRIMARY KEY,
    perfil_id INT NOT NULL,
    permiso_id INT NOT NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (perfil_id) REFERENCES perfiles(id) ON DELETE CASCADE,
    FOREIGN KEY (permiso_id) REFERENCES permisos(id) ON DELETE CASCADE,
    UNIQUE KEY unique_perfil_permiso (perfil_id, permiso_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- Tabla de usuarios
CREATE TABLE IF NOT EXISTS usuarios (
    id INT AUTO_INCREMENT PRIMARY KEY,
    username VARCHAR(50) NOT NULL UNIQUE,
    password VARCHAR(255) NOT NULL,
    nombre VARCHAR(150) NOT NULL,
    email VARCHAR(150),
    telefono VARCHAR(20),
    perfil_id INT NOT NULL,
    activo TINYINT(1) DEFAULT 1,
    ultimo_acceso TIMESTAMP NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    FOREIGN KEY (perfil_id) REFERENCES perfiles(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- Insertar permisos por defecto (uno por cada modulo del menu)
INSERT INTO permisos (codigo, nombre, descripcion, modulo) VALUES
('ver_inicio', 'Ver Inicio', 'Acceso al dashboard de inicio', 'inicio'),
('ver_ventas', 'Ver Ventas', 'Acceso al modulo de ventas', 'ventas'),
('ver_productos', 'Ver Productos', 'Acceso al modulo de productos', 'productos'),
('ver_ingredientes', 'Ver Ingredientes', 'Acceso al modulo de ingredientes', 'ingredientes'),
('ver_clientes', 'Ver Clientes', 'Acceso al modulo de clientes', 'clientes'),
('ver_caja', 'Ver Caja', 'Acceso al modulo de caja', 'caja'),
('ver_reportes', 'Ver Reportes', 'Acceso al modulo de reportes', 'reportes'),
('ver_estadisticas', 'Ver Estadisticas', 'Acceso al modulo de estadisticas', 'estadisticas'),
('ver_configuracion', 'Ver Configuracion', 'Acceso al modulo de configuracion', 'configuracion'),
('ver_usuarios', 'Ver Usuarios', 'Acceso al modulo de usuarios', 'usuarios'),
('ver_perfiles', 'Ver Perfiles', 'Acceso al modulo de perfiles', 'perfiles')
ON DUPLICATE KEY UPDATE nombre = VALUES(nombre);

-- Insertar perfiles por defecto
INSERT INTO perfiles (nombre, descripcion) VALUES
('Administrador', 'Acceso total al sistema'),
('Vendedor', 'Acceso a ventas y clientes'),
('Cajero', 'Acceso a caja y ventas')
ON DUPLICATE KEY UPDATE descripcion = VALUES(descripcion);

-- Asignar todos los permisos al perfil Administrador
INSERT INTO perfil_permisos (perfil_id, permiso_id)
SELECT
    (SELECT id FROM perfiles WHERE nombre = 'Administrador'),
    id
FROM permisos
ON DUPLICATE KEY UPDATE perfil_id = perfil_id;

-- Asignar permisos al perfil Vendedor
INSERT INTO perfil_permisos (perfil_id, permiso_id)
SELECT
    (SELECT id FROM perfiles WHERE nombre = 'Vendedor'),
    id
FROM permisos
WHERE codigo IN ('ver_inicio', 'ver_ventas', 'ver_productos', 'ver_clientes')
ON DUPLICATE KEY UPDATE perfil_id = perfil_id;

-- Asignar permisos al perfil Cajero
INSERT INTO perfil_permisos (perfil_id, permiso_id)
SELECT
    (SELECT id FROM perfiles WHERE nombre = 'Cajero'),
    id
FROM permisos
WHERE codigo IN ('ver_inicio', 'ver_ventas', 'ver_caja')
ON DUPLICATE KEY UPDATE perfil_id = perfil_id;

-- Insertar usuario administrador por defecto (password: admin123)
INSERT INTO usuarios (username, password, nombre, email, perfil_id) VALUES
('admin', '$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', 'Administrador', 'admin@postorti.com',
    (SELECT id FROM perfiles WHERE nombre = 'Administrador'))
ON DUPLICATE KEY UPDATE nombre = VALUES(nombre);
