-- ============================================
-- Script Consolidado para Importar Todas as Tabelas
-- Use este script se você já criou o banco de dados manualmente
-- Execute no banco: trainees_financeiro
-- ============================================

-- IMPORTANTE: Certifique-se de estar usando o banco correto
-- USE trainees_financeiro;

-- ============================================
-- PARTE 1: TABELAS BÁSICAS DO SISTEMA FINANCEIRO
-- ============================================

-- Tabela de contas (banco ou caixa)
CREATE TABLE IF NOT EXISTS accounts (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(255) NOT NULL COMMENT 'Nome da conta (ex: Banco do Brasil, Caixa Principal)',
    type ENUM('bank', 'cash') NOT NULL COMMENT 'Tipo: bank (banco) ou cash (caixa)',
    balance DECIMAL(15, 2) DEFAULT 0.00 NOT NULL COMMENT 'Saldo atual da conta',
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    INDEX idx_type (type),
    INDEX idx_name (name)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='Contas bancárias e de caixa';

-- Tabela de fornecedores
CREATE TABLE IF NOT EXISTS suppliers (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(255) NOT NULL COMMENT 'Nome do fornecedor',
    contact VARCHAR(255) DEFAULT NULL COMMENT 'Nome do contato',
    email VARCHAR(255) DEFAULT NULL COMMENT 'E-mail do fornecedor',
    phone VARCHAR(20) DEFAULT NULL COMMENT 'Telefone do fornecedor',
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    INDEX idx_name (name)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='Fornecedores e clientes';

-- Tabela de plano de contas
CREATE TABLE IF NOT EXISTS chart_of_accounts (
    id INT AUTO_INCREMENT PRIMARY KEY,
    code VARCHAR(50) NOT NULL UNIQUE COMMENT 'Código do plano de contas (ex: 1.1.01)',
    description VARCHAR(255) NOT NULL COMMENT 'Descrição da conta',
    type ENUM('income', 'expense') NOT NULL COMMENT 'Tipo: income (receita) ou expense (despesa)',
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    INDEX idx_type (type),
    INDEX idx_code (code)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='Plano de contas contábil';

-- Tabela de usuários (simples para autenticação)
CREATE TABLE IF NOT EXISTS users (
    id INT AUTO_INCREMENT PRIMARY KEY,
    username VARCHAR(100) NOT NULL UNIQUE,
    password_hash VARCHAR(255) NOT NULL,
    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 COMMENT='Usuários do sistema';

-- Tabela de contas a receber
CREATE TABLE IF NOT EXISTS receivables (
    id INT AUTO_INCREMENT PRIMARY KEY,
    supplier_id INT NOT NULL COMMENT 'ID do fornecedor/cliente',
    account_id INT NOT NULL COMMENT 'ID da conta onde será creditado',
    amount DECIMAL(15, 2) NOT NULL COMMENT 'Valor a receber',
    due_date DATE NOT NULL COMMENT 'Data de vencimento',
    status ENUM('pending', 'paid') DEFAULT 'pending' NOT NULL COMMENT 'Status: pending (pendente) ou paid (pago)',
    description TEXT DEFAULT NULL COMMENT 'Descrição adicional',
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    FOREIGN KEY (supplier_id) REFERENCES suppliers(id) ON DELETE RESTRICT,
    FOREIGN KEY (account_id) REFERENCES accounts(id) ON DELETE RESTRICT,
    INDEX idx_status (status),
    INDEX idx_due_date (due_date),
    INDEX idx_supplier (supplier_id),
    INDEX idx_account (account_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='Contas a receber';

-- Tabela de contas a pagar
CREATE TABLE IF NOT EXISTS payables (
    id INT AUTO_INCREMENT PRIMARY KEY,
    supplier_id INT NOT NULL COMMENT 'ID do fornecedor',
    account_id INT NOT NULL COMMENT 'ID da conta onde será debitado',
    amount DECIMAL(15, 2) NOT NULL COMMENT 'Valor a pagar',
    due_date DATE NOT NULL COMMENT 'Data de vencimento',
    status ENUM('pending', 'paid') DEFAULT 'pending' NOT NULL COMMENT 'Status: pending (pendente) ou paid (pago)',
    description TEXT DEFAULT NULL COMMENT 'Descrição adicional',
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    FOREIGN KEY (supplier_id) REFERENCES suppliers(id) ON DELETE RESTRICT,
    FOREIGN KEY (account_id) REFERENCES accounts(id) ON DELETE RESTRICT,
    INDEX idx_status (status),
    INDEX idx_due_date (due_date),
    INDEX idx_supplier (supplier_id),
    INDEX idx_account (account_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='Contas a pagar';

-- Tabela de transações (movimentação geral)
CREATE TABLE IF NOT EXISTS transactions (
    id INT AUTO_INCREMENT PRIMARY KEY,
    account_id INT NOT NULL COMMENT 'ID da conta',
    type ENUM('inflow', 'outflow') NOT NULL COMMENT 'Tipo: inflow (entrada) ou outflow (saída)',
    amount DECIMAL(15, 2) NOT NULL COMMENT 'Valor da transação',
    reference_id INT DEFAULT NULL COMMENT 'ID de referência (receivable_id ou payable_id)',
    reference_type ENUM('receivable', 'payable', 'manual') DEFAULT 'manual' COMMENT 'Tipo de referência',
    description TEXT DEFAULT NULL COMMENT 'Descrição da transação',
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (account_id) REFERENCES accounts(id) ON DELETE RESTRICT,
    INDEX idx_account (account_id),
    INDEX idx_type (type),
    INDEX idx_reference (reference_id, reference_type),
    INDEX idx_created_at (created_at)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='Movimentações financeiras';

-- Inserir usuário admin padrão (username: admin, password: admin123)
INSERT IGNORE INTO users (username, password_hash) VALUES 
('admin', '$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi');

-- ============================================
-- PARTE 2: SISTEMA DE ROLES E PERMISSÕES
-- ============================================

-- Tabela de roles (níveis de acesso)
CREATE TABLE IF NOT EXISTS roles (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(100) NOT NULL UNIQUE COMMENT 'Nome do nível de acesso (ex: Admin, Usuário)',
    description TEXT DEFAULT 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
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='Níveis de acesso';

-- Tabela de permissões
CREATE TABLE IF NOT EXISTS permissions (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(100) NOT NULL UNIQUE COMMENT 'Nome da permissão (ex: receivables.view)',
    description TEXT DEFAULT NULL COMMENT 'Descrição da permissão',
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='Permissões do sistema';

-- Tabela de relação entre roles e permissões
CREATE TABLE IF NOT EXISTS role_permissions (
    role_id INT NOT NULL,
    permission_id INT 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
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='Permissões por nível de acesso';

-- Adicionar coluna role_id em users se não existir
SET @dbname = DATABASE();
SET @tablename = 'users';
SET @columnname = 'role_id';
SET @preparedStatement = (SELECT IF(
  (
    SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS
    WHERE
      (table_name = @tablename)
      AND (table_schema = @dbname)
      AND (column_name = @columnname)
  ) > 0,
  'SELECT 1',
  CONCAT('ALTER TABLE ', @tablename, ' ADD COLUMN ', @columnname, ' INT DEFAULT NULL, ADD FOREIGN KEY (', @columnname, ') REFERENCES roles(id) ON DELETE SET NULL')
));
PREPARE alterIfNotExists FROM @preparedStatement;
EXECUTE alterIfNotExists;
DEALLOCATE PREPARE alterIfNotExists;

-- ============================================
-- NOTA: Para importar as tabelas restantes (students, companies, vacancies, etc.),
-- você precisa executar os scripts individuais na pasta sql/ conforme o guia
-- GUIA_IMPORTAR_TABELAS.md
-- ============================================

-- Este script cria apenas as tabelas básicas do sistema financeiro.
-- Para funcionalidades completas, execute também:
-- - add_clients_tables.sql (estudantes, empresas, serviços)
-- - create_vacancies_table.sql (vagas)
-- - create_interview_schedules_table.sql (entrevistas)
-- - create_document_templates_tables.sql (documentos)
-- - E outros scripts conforme necessário


