-- Criação do Banco de Dados V2
CREATE DATABASE IF NOT EXISTS agendaex_carteira CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
USE agendaex_carteira;

-- 1. Tabela de Usuários (com 2FA)
CREATE TABLE IF NOT EXISTS usuarios (
    id INT AUTO_INCREMENT PRIMARY KEY,
    nome VARCHAR(100) NOT NULL,
    email VARCHAR(100) UNIQUE NOT NULL,
    senha_hash VARCHAR(255) NOT NULL,
    two_factor_secret VARCHAR(255) NULL,
    two_factor_enabled BOOLEAN DEFAULT FALSE,
    theme_preference ENUM('light', 'dark', 'system') DEFAULT 'system',
    criado_em TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    ultimo_login TIMESTAMP NULL
);

-- 2. Tabela de Ativos (Stocks)
CREATE TABLE IF NOT EXISTS ativos (
    id INT AUTO_INCREMENT PRIMARY KEY,
    usuario_id INT NOT NULL,
    ticker VARCHAR(20) NOT NULL,
    nome VARCHAR(100) NOT NULL,
    tipo ENUM('ACAO', 'FII', 'BDR', 'ETF') NOT NULL,
    quantidade_total INT DEFAULT 0,
    quantidade_bloqueada INT DEFAULT 0,
    preco_medio DECIMAL(10,4) DEFAULT 0.0000,
    criado_em TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    atualizado_em TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    FOREIGN KEY (usuario_id) REFERENCES usuarios(id) ON DELETE CASCADE,
    UNIQUE KEY uk_usuario_ticker (usuario_id, ticker)
);

-- 3. Tabela de Operações com Opções (Open / History)
CREATE TABLE IF NOT EXISTS operacoes_opcoes (
    id INT AUTO_INCREMENT PRIMARY KEY,
    usuario_id INT NOT NULL,
    ativo_id INT NOT NULL,
    ticker_opcao VARCHAR(20) NOT NULL,
    tipo_opcao ENUM('CALL', 'PUT') NOT NULL,
    direcao ENUM('COMPRA', 'VENDA') NOT NULL,
    strike DECIMAL(10,4) NOT NULL,
    premium DECIMAL(10,4) NOT NULL,
    contracts INT NOT NULL, -- 1 contract = 100 shares
    notional DECIMAL(12,4) GENERATED ALWAYS AS (strike * contracts * 100) STORED,
    data_operacao DATE NOT NULL,
    data_vencimento DATE NOT NULL,
    status ENUM('ABERTA', 'EXERCIDA', 'VENCIDA', 'FECHADA') DEFAULT 'ABERTA',
    preco_fechamento DECIMAL(10,4) NULL,
    data_fechamento TIMESTAMP NULL,
    gross DECIMAL(10,4) NULL,
    ir DECIMAL(10,4) NULL,
    net DECIMAL(10,4) NULL,
    notas TEXT NULL,
    criado_em TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (usuario_id) REFERENCES usuarios(id) ON DELETE CASCADE,
    FOREIGN KEY (ativo_id) REFERENCES ativos(id) ON DELETE CASCADE
);

-- 4. Tabela de Movimentações (Movements - Compras/Vendas de Ações)
CREATE TABLE IF NOT EXISTS movimentacoes (
    id INT AUTO_INCREMENT PRIMARY KEY,
    usuario_id INT NOT NULL,
    ativo_id INT NOT NULL,
    tipo_movimento ENUM('COMPRA', 'VENDA', 'DESDOBRAMENTO', 'GRUPAMENTO') NOT NULL,
    quantidade INT NOT NULL,
    preco_unitario DECIMAL(10,4) NOT NULL,
    taxas DECIMAL(10,4) DEFAULT 0.0000,
    data_movimento DATE NOT NULL,
    notas TEXT NULL,
    criado_em TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (usuario_id) REFERENCES usuarios(id) ON DELETE CASCADE,
    FOREIGN KEY (ativo_id) REFERENCES ativos(id) ON DELETE CASCADE
);

-- 5. Tabela de Snapshots (Histórico da Carteira)
CREATE TABLE IF NOT EXISTS snapshots_carteira (
    id INT AUTO_INCREMENT PRIMARY KEY,
    usuario_id INT NOT NULL,
    data_snapshot DATE NOT NULL,
    total_investido DECIMAL(12,4) NOT NULL,
    valor_atual DECIMAL(12,4) NOT NULL,
    lucro_prejuizo DECIMAL(12,4) NOT NULL,
    dados_json JSON NOT NULL, -- Guarda a foto completa da carteira no dia
    criado_em TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (usuario_id) REFERENCES usuarios(id) ON DELETE CASCADE,
    UNIQUE KEY uk_usuario_data (usuario_id, data_snapshot)
);

-- 6. Tabela de Logs de Auditoria
CREATE TABLE IF NOT EXISTS auditoria_logs (
    id INT AUTO_INCREMENT PRIMARY KEY,
    usuario_id INT NOT NULL,
    acao VARCHAR(50) NOT NULL,
    tabela_afetada VARCHAR(50) NOT NULL,
    registro_id INT NOT NULL,
    dados_antigos JSON NULL,
    dados_novos JSON NULL,
    ip_address VARCHAR(45) NOT NULL,
    user_agent TEXT NOT NULL,
    criado_em TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (usuario_id) REFERENCES usuarios(id) ON DELETE CASCADE
);

-- Inserir usuário admin (senha: 123456)
INSERT IGNORE INTO usuarios (nome, email, senha_hash) VALUES ('Administrador', 'admin@teste.com', '$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi');
