-- Tabela de níveis de acesso (roles)
CREATE TABLE IF NOT EXISTS roles (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(100) NOT NULL COMMENT 'Nome do nível de acesso',
    description TEXT NULL COMMENT 'Descrição do nível de acesso',
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    UNIQUE KEY unique_name (name)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='Níveis de acesso do sistema';

-- Tabela de permissões (funcionalidades)
CREATE TABLE IF NOT EXISTS permissions (
    id INT AUTO_INCREMENT PRIMARY KEY,
    key_name VARCHAR(100) NOT NULL COMMENT 'Chave única da permissão',
    name VARCHAR(255) NOT NULL COMMENT 'Nome da funcionalidade',
    module VARCHAR(50) NOT NULL COMMENT 'Módulo (Financeiro, Relatórios, Vagas, etc)',
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    UNIQUE KEY unique_key (key_name)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='Permissões disponíveis no sistema';

-- Tabela de associação entre roles e permissions
CREATE TABLE IF NOT EXISTS role_permissions (
    id INT AUTO_INCREMENT PRIMARY KEY,
    role_id INT NOT NULL,
    permission_id INT NOT NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (role_id) REFERENCES roles(id) ON DELETE CASCADE,
    FOREIGN KEY (permission_id) REFERENCES permissions(id) ON DELETE CASCADE,
    UNIQUE KEY unique_role_permission (role_id, permission_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='Permissões por nível de acesso';

-- Adiciona campo role_id na tabela users
ALTER TABLE users 
ADD COLUMN role_id INT NULL COMMENT 'ID do nível de acesso' 
AFTER password_hash,
ADD INDEX idx_role (role_id),
ADD FOREIGN KEY (role_id) REFERENCES roles(id) ON DELETE SET NULL;

-- Insere permissões padrão
INSERT INTO permissions (key_name, name, module) VALUES
-- Dashboard
('dashboard.view', 'Visualizar Dashboard Principal', 'Dashboard'),
('dashboard.financial', 'Visualizar Dashboard Financeiro', 'Dashboard'),
('dashboard.reports', 'Visualizar Dashboard Relatórios', 'Dashboard'),
-- Financeiro
('financeiro.view', 'Visualizar Financeiro', 'Financeiro'),
('financeiro.create', 'Criar Registros Financeiros', 'Financeiro'),
('financeiro.edit', 'Editar Registros Financeiros', 'Financeiro'),
('financeiro.delete', 'Excluir Registros Financeiros', 'Financeiro'),
-- Relatórios
('relatorios.view', 'Visualizar Relatórios', 'Relatórios'),
('relatorios.receivables', 'Relatório Contas a Receber', 'Relatórios'),
('relatorios.payables', 'Relatório Contas a Pagar', 'Relatórios'),
('relatorios.managerial', 'Relatórios Gerenciais', 'Relatórios'),
('relatorios.vacancies', 'Relatório Vagas', 'Relatórios'),
-- Vagas
('vagas.view', 'Visualizar Vagas', 'Vagas'),
('vagas.create', 'Criar Vagas', 'Vagas'),
('vagas.edit', 'Editar Vagas', 'Vagas'),
('vagas.delete', 'Excluir Vagas', 'Vagas'),
('vagas.close', 'Fechar Vagas', 'Vagas'),
('vagas.fill', 'Preencher Vagas', 'Vagas'),
-- Cadastros Gerais
('cadastros.view', 'Visualizar Cadastros Gerais', 'Cadastros'),
('cadastros.create', 'Criar Cadastros Gerais', 'Cadastros'),
('cadastros.delete', 'Excluir Cadastros Gerais', 'Cadastros'),
-- Usuários
('usuarios.view', 'Visualizar Usuários', 'Usuários'),
('usuarios.create', 'Criar Usuários', 'Usuários'),
('usuarios.edit', 'Editar Usuários', 'Usuários'),
('usuarios.delete', 'Excluir Usuários', 'Usuários'),
-- Níveis de Acesso
('roles.view', 'Visualizar Níveis de Acesso', 'Níveis de Acesso'),
('roles.create', 'Criar Níveis de Acesso', 'Níveis de Acesso'),
('roles.edit', 'Editar Níveis de Acesso', 'Níveis de Acesso'),
('roles.delete', 'Excluir Níveis de Acesso', 'Níveis de Acesso')
ON DUPLICATE KEY UPDATE name = name;

-- Insere nível de acesso padrão (Administrador)
INSERT INTO roles (name, description) VALUES
('Administrador', 'Acesso total ao sistema')
ON DUPLICATE KEY UPDATE name = name;

-- Associa todas as permissões ao Administrador
INSERT INTO role_permissions (role_id, permission_id)
SELECT 1, id FROM permissions
ON DUPLICATE KEY UPDATE role_id = role_id;

