-- Tabela de roles
CREATE TABLE IF NOT EXISTS roles (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    nome VARCHAR(50) NOT NULL UNIQUE,
    nivel INTEGER NOT NULL,
    descricao TEXT
);

-- Tabela de permissões
CREATE TABLE IF NOT EXISTS permissions (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    nome VARCHAR(50) NOT NULL UNIQUE,
    descricao TEXT
);

-- Tabela de mapeamento Role-Permission
CREATE TABLE IF NOT EXISTS role_permissions (
    role_id INTEGER NOT NULL,
    permission_id INTEGER NOT NULL,
    PRIMARY KEY (role_id, permission_id),
    FOREIGN KEY (role_id) REFERENCES roles(id) ON DELETE CASCADE,
    FOREIGN KEY (permission_id) REFERENCES permissions(id) ON DELETE CASCADE
);

-- Tabela de mapeamento User-Role
CREATE TABLE IF NOT EXISTS user_roles (
    user_id INTEGER NOT NULL,
    role_id INTEGER NOT NULL,
    PRIMARY KEY (user_id, role_id),
    FOREIGN KEY (user_id) REFERENCES usuarios(id) ON DELETE CASCADE,
    FOREIGN KEY (role_id) REFERENCES roles(id) ON DELETE CASCADE
);

-- Inserir roles básicas
INSERT OR IGNORE INTO roles (nome, nivel, descricao) VALUES
    ('Militante Básico', 1, 'Militante com permissões básicas'),
    ('Secretário de Célula', 2, 'Responsável por uma célula'),
    ('Membro de Setor', 3, 'Membro de um setor'),
    ('Secretário de Setor', 4, 'Responsável por um setor'),
    ('Membro de CR', 5, 'Membro de um Comitê Regional'),
    ('Secretário de CR', 6, 'Responsável por um Comitê Regional'),
    ('Membro do CC', 7, 'Membro do Comitê Central'),
    ('Secretário Geral', 8, 'Secretário Geral ou de Organização do CC');

-- Inserir permissões básicas
INSERT OR IGNORE INTO permissions (nome, descricao) VALUES
    -- Permissões básicas
    ('view_own_data', 'Visualizar próprios dados'),
    ('edit_own_data', 'Editar próprios dados'),
    ('view_cell_data', 'Visualizar dados da célula'),
    ('create_militant', 'Criar novos militantes'),
    
    -- Permissões de célula
    ('manage_cell_members', 'Gerenciar membros da célula'),
    ('create_cell_member', 'Criar membros na célula'),
    ('view_cell_reports', 'Visualizar relatórios da célula'),
    
    -- Permissões de setor
    ('manage_sector_cells', 'Gerenciar células do setor'),
    ('create_sector_cell', 'Criar células no setor'),
    ('view_sector_reports', 'Visualizar relatórios do setor'),
    
    -- Permissões de CR
    ('manage_cr_sectors', 'Gerenciar setores do CR'),
    ('create_cr_sector', 'Criar setores no CR'),
    ('view_cr_reports', 'Visualizar relatórios do CR'),
    
    -- Permissões de CC
    ('manage_cc_crs', 'Gerenciar CRs'),
    ('create_cc_cr', 'Criar CRs'),
    ('view_cc_reports', 'Visualizar relatórios nacionais'),
    ('system_config', 'Configurar sistema');

-- Mapear permissões para roles
-- Militante Básico
INSERT OR IGNORE INTO role_permissions (role_id, permission_id)
SELECT r.id, p.id
FROM roles r, permissions p
WHERE r.nome = 'Militante Básico'
AND p.nome IN ('view_own_data', 'edit_own_data', 'view_cell_data');

-- Secretário de Célula
INSERT OR IGNORE INTO role_permissions (role_id, permission_id)
SELECT r.id, p.id
FROM roles r, permissions p
WHERE r.nome = 'Secretário de Célula'
AND p.nome IN ('view_own_data', 'edit_own_data', 'view_cell_data',
               'manage_cell_members', 'create_cell_member', 'view_cell_reports',
               'create_militant');

-- Membro de Setor
INSERT OR IGNORE INTO role_permissions (role_id, permission_id)
SELECT r.id, p.id
FROM roles r, permissions p
WHERE r.nome = 'Membro de Setor'
AND p.nome IN ('view_own_data', 'edit_own_data', 'view_cell_data',
               'manage_cell_members', 'create_cell_member', 'view_cell_reports',
               'view_sector_reports', 'create_militant');

-- Secretário de Setor
INSERT OR IGNORE INTO role_permissions (role_id, permission_id)
SELECT r.id, p.id
FROM roles r, permissions p
WHERE r.nome = 'Secretário de Setor'
AND p.nome IN ('view_own_data', 'edit_own_data', 'view_cell_data',
               'manage_cell_members', 'create_cell_member', 'view_cell_reports',
               'view_sector_reports', 'manage_sector_cells', 'create_sector_cell',
               'create_militant');

-- Membro de CR
INSERT OR IGNORE INTO role_permissions (role_id, permission_id)
SELECT r.id, p.id
FROM roles r, permissions p
WHERE r.nome = 'Membro de CR'
AND p.nome IN ('view_own_data', 'edit_own_data', 'view_cell_data',
               'manage_cell_members', 'create_cell_member', 'view_cell_reports',
               'view_sector_reports', 'manage_sector_cells', 'create_sector_cell',
               'view_cr_reports', 'create_militant');

-- Secretário de CR
INSERT OR IGNORE INTO role_permissions (role_id, permission_id)
SELECT r.id, p.id
FROM roles r, permissions p
WHERE r.nome = 'Secretário de CR'
AND p.nome IN ('view_own_data', 'edit_own_data', 'view_cell_data',
               'manage_cell_members', 'create_cell_member', 'view_cell_reports',
               'view_sector_reports', 'manage_sector_cells', 'create_sector_cell',
               'view_cr_reports', 'manage_cr_sectors', 'create_cr_sector',
               'create_militant');

-- Membro do CC
INSERT OR IGNORE INTO role_permissions (role_id, permission_id)
SELECT r.id, p.id
FROM roles r, permissions p
WHERE r.nome = 'Membro do CC'
AND p.nome IN ('view_own_data', 'edit_own_data', 'view_cell_data',
               'manage_cell_members', 'create_cell_member', 'view_cell_reports',
               'view_sector_reports', 'manage_sector_cells', 'create_sector_cell',
               'view_cr_reports', 'manage_cr_sectors', 'create_cr_sector',
               'view_cc_reports', 'create_militant');

-- Secretário Geral
INSERT OR IGNORE INTO role_permissions (role_id, permission_id)
SELECT r.id, p.id
FROM roles r, permissions p
WHERE r.nome = 'Secretário Geral'
AND p.nome IN ('view_own_data', 'edit_own_data', 'view_cell_data',
               'manage_cell_members', 'create_cell_member', 'view_cell_reports',
               'view_sector_reports', 'manage_sector_cells', 'create_sector_cell',
               'view_cr_reports', 'manage_cr_sectors', 'create_cr_sector',
               'view_cc_reports', 'manage_cc_crs', 'create_cc_cr',
               'system_config', 'create_militant'); 