-- ============================================
-- BINGO PRO V2 - DATABASE SCHEMA
-- Sistema Profissional de Bingo
-- Versão: 2.0.0
-- ============================================

-- Configurações iniciais
START TRANSACTION;

-- Criar banco de dados
CREATE DATABASE IF NOT EXISTS `bingo_pro_v2`
DEFAULT CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;

USE `bingo_pro_v2`;

-- ============================================
-- TABELA: users
-- Gerenciamento de usuários do sistema
-- ============================================
CREATE TABLE `users` (
  `id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,
  `nome` VARCHAR(100) NOT NULL,
  `email` VARCHAR(100) DEFAULT NULL,
  `telefone` VARCHAR(20) NOT NULL,
  `senha_hash` VARCHAR(255) NOT NULL,
  `saldo` DECIMAL(10,2) NOT NULL DEFAULT 0.00,
  `tipo` ENUM('admin', 'jogador', 'afiliado', 'banqueiro') NOT NULL DEFAULT 'jogador',
  `codigo_afiliado` VARCHAR(10) DEFAULT NULL,
  `referido_por_id` INT(11) UNSIGNED DEFAULT NULL,
  `total_ganho` DECIMAL(10,2) NOT NULL DEFAULT 0.00,
  `total_gasto` DECIMAL(10,2) NOT NULL DEFAULT 0.00,
  `status` ENUM('ativo', 'bloqueado', 'inativo') NOT NULL DEFAULT 'ativo',
  `ultimo_acesso` DATETIME DEFAULT NULL,
  `created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `updated_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  UNIQUE KEY `email` (`email`),
  UNIQUE KEY `telefone` (`telefone`),
  UNIQUE KEY `codigo_afiliado` (`codigo_afiliado`),
  KEY `referido_por_id` (`referido_por_id`),
  KEY `idx_tipo` (`tipo`),
  KEY `idx_status` (`status`),
  CONSTRAINT `fk_users_referido` FOREIGN KEY (`referido_por_id`) REFERENCES `users` (`id`) ON DELETE SET NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ============================================
-- TABELA: games
-- Gerenciamento de rodadas de jogo
-- ============================================
CREATE TABLE `games` (
  `id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,
  `codigo` VARCHAR(20) NOT NULL,
  `status` ENUM('aberto', 'rodando', 'pausado', 'finalizado', 'cancelado') NOT NULL DEFAULT 'aberto',
  `tipo_jogo` ENUM('bingo90', 'bingo75', 'turbo') NOT NULL DEFAULT 'bingo90',
  `data_inicio` DATETIME DEFAULT NULL,
  `data_fim` DATETIME DEFAULT NULL,
  `bolas_sorteadas` JSON DEFAULT NULL COMMENT 'Array de números sorteados',
  `total_bolas` INT(3) NOT NULL DEFAULT 90,
  `premio_quina` DECIMAL(10,2) NOT NULL DEFAULT 10.00,
  `premio_bingo` DECIMAL(10,2) NOT NULL DEFAULT 50.00,
  `acumulado` DECIMAL(10,2) NOT NULL DEFAULT 0.00,
  `total_arrecadado` DECIMAL(10,2) NOT NULL DEFAULT 0.00,
  `total_cartelas_vendidas` INT(11) NOT NULL DEFAULT 0,
  `preco_cartela` DECIMAL(10,2) NOT NULL DEFAULT 2.00,
  `vencedor_quina_id` INT(11) UNSIGNED DEFAULT NULL,
  `vencedor_bingo_id` INT(11) UNSIGNED DEFAULT NULL,
  `criado_por` INT(11) UNSIGNED NOT NULL,
  `observacoes` TEXT DEFAULT NULL,
  `created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `updated_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  UNIQUE KEY `codigo` (`codigo`),
  KEY `idx_status` (`status`),
  KEY `idx_data_inicio` (`data_inicio`),
  KEY `vencedor_quina_id` (`vencedor_quina_id`),
  KEY `vencedor_bingo_id` (`vencedor_bingo_id`),
  KEY `criado_por` (`criado_por`),
  CONSTRAINT `fk_games_criado_por` FOREIGN KEY (`criado_por`) REFERENCES `users` (`id`),
  CONSTRAINT `fk_games_vencedor_quina` FOREIGN KEY (`vencedor_quina_id`) REFERENCES `users` (`id`) ON DELETE SET NULL,
  CONSTRAINT `fk_games_vencedor_bingo` FOREIGN KEY (`vencedor_bingo_id`) REFERENCES `users` (`id`) ON DELETE SET NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ============================================
-- TABELA: cartelas
-- Gerenciamento de cartelas do jogo
-- ============================================
CREATE TABLE `cartelas` (
  `id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,
  `user_id` INT(11) UNSIGNED NOT NULL,
  `game_id` INT(11) UNSIGNED NOT NULL,
  `codigo_unico` VARCHAR(20) NOT NULL,
  `numeros` JSON NOT NULL COMMENT 'Array com 15 números da cartela',
  `numeros_marcados` JSON DEFAULT NULL COMMENT 'Array com números já marcados',
  `status` ENUM('ativa', 'quina', 'bingo', 'expirada', 'cancelada') NOT NULL DEFAULT 'ativa',
  `tipo` ENUM('impressa', 'online', 'hibrida') NOT NULL DEFAULT 'online',
  `qrcode_path` VARCHAR(255) DEFAULT NULL,
  `pdf_path` VARCHAR(255) DEFAULT NULL,
  `total_acertos` INT(2) NOT NULL DEFAULT 0,
  `data_quina` DATETIME DEFAULT NULL,
  `data_bingo` DATETIME DEFAULT NULL,
  `validada_por` INT(11) UNSIGNED DEFAULT NULL,
  `observacoes` TEXT DEFAULT NULL,
  `created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `updated_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  UNIQUE KEY `codigo_unico` (`codigo_unico`),
  KEY `user_id` (`user_id`),
  KEY `game_id` (`game_id`),
  KEY `idx_status` (`status`),
  KEY `idx_tipo` (`tipo`),
  KEY `validada_por` (`validada_por`),
  CONSTRAINT `fk_cartelas_user` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE,
  CONSTRAINT `fk_cartelas_game` FOREIGN KEY (`game_id`) REFERENCES `games` (`id`) ON DELETE CASCADE,
  CONSTRAINT `fk_cartelas_validada_por` FOREIGN KEY (`validada_por`) REFERENCES `users` (`id`) ON DELETE SET NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ============================================
-- TABELA: transacoes
-- Gerenciamento financeiro completo
-- ============================================
CREATE TABLE `transacoes` (
  `id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,
  `user_id` INT(11) UNSIGNED NOT NULL,
  `game_id` INT(11) UNSIGNED DEFAULT NULL,
  `tipo` ENUM('deposito_pix', 'compra_cartela', 'premio_quina', 'premio_bingo', 'saque', 'comissao_afiliado', 'estorno', 'taxa_sistema') NOT NULL,
  `valor` DECIMAL(10,2) NOT NULL,
  `saldo_anterior` DECIMAL(10,2) NOT NULL,
  `saldo_posterior` DECIMAL(10,2) NOT NULL,
  `descricao` TEXT DEFAULT NULL,
  `comprovante_path` VARCHAR(255) DEFAULT NULL,
  `pix_codigo` TEXT DEFAULT NULL COMMENT 'Código PIX copia e cola',
  `pix_txid` VARCHAR(100) DEFAULT NULL COMMENT 'Transaction ID do PIX',
  `status` ENUM('pendente', 'aprovado', 'rejeitado', 'processando', 'cancelado') NOT NULL DEFAULT 'pendente',
  `aprovado_por` INT(11) UNSIGNED DEFAULT NULL,
  `data_aprovacao` DATETIME DEFAULT NULL,
  `ip_origem` VARCHAR(45) DEFAULT NULL,
  `metadata` JSON DEFAULT NULL COMMENT 'Dados adicionais em JSON',
  `created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `updated_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  KEY `user_id` (`user_id`),
  KEY `game_id` (`game_id`),
  KEY `idx_tipo` (`tipo`),
  KEY `idx_status` (`status`),
  KEY `idx_created_at` (`created_at`),
  KEY `aprovado_por` (`aprovado_por`),
  CONSTRAINT `fk_transacoes_user` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE,
  CONSTRAINT `fk_transacoes_game` FOREIGN KEY (`game_id`) REFERENCES `games` (`id`) ON DELETE SET NULL,
  CONSTRAINT `fk_transacoes_aprovado_por` FOREIGN KEY (`aprovado_por`) REFERENCES `users` (`id`) ON DELETE SET NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ============================================
-- TABELA: comissoes_afiliados
-- Tracking detalhado de comissões
-- ============================================
CREATE TABLE `comissoes_afiliados` (
  `id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,
  `afiliado_id` INT(11) UNSIGNED NOT NULL,
  `referido_id` INT(11) UNSIGNED NOT NULL,
  `transacao_id` INT(11) UNSIGNED NOT NULL,
  `game_id` INT(11) UNSIGNED DEFAULT NULL,
  `valor_transacao` DECIMAL(10,2) NOT NULL,
  `percentual_comissao` DECIMAL(5,2) NOT NULL,
  `valor_comissao` DECIMAL(10,2) NOT NULL,
  `status` ENUM('pendente', 'pago', 'cancelado') NOT NULL DEFAULT 'pendente',
  `data_pagamento` DATETIME DEFAULT NULL,
  `created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  KEY `afiliado_id` (`afiliado_id`),
  KEY `referido_id` (`referido_id`),
  KEY `transacao_id` (`transacao_id`),
  KEY `game_id` (`game_id`),
  KEY `idx_status` (`status`),
  CONSTRAINT `fk_comissoes_afiliado` FOREIGN KEY (`afiliado_id`) REFERENCES `users` (`id`) ON DELETE CASCADE,
  CONSTRAINT `fk_comissoes_referido` FOREIGN KEY (`referido_id`) REFERENCES `users` (`id`) ON DELETE CASCADE,
  CONSTRAINT `fk_comissoes_transacao` FOREIGN KEY (`transacao_id`) REFERENCES `transacoes` (`id`) ON DELETE CASCADE,
  CONSTRAINT `fk_comissoes_game` FOREIGN KEY (`game_id`) REFERENCES `games` (`id`) ON DELETE SET NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ============================================
-- TABELA: config
-- Configurações globais do sistema
-- ============================================
CREATE TABLE `config` (
  `id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,
  `chave` VARCHAR(50) NOT NULL,
  `valor` TEXT NOT NULL,
  `tipo` ENUM('string', 'number', 'boolean', 'json') NOT NULL DEFAULT 'string',
  `descricao` TEXT DEFAULT NULL,
  `categoria` VARCHAR(50) DEFAULT 'geral',
  `editavel` TINYINT(1) NOT NULL DEFAULT 1,
  `created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `updated_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  UNIQUE KEY `chave` (`chave`),
  KEY `idx_categoria` (`categoria`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ============================================
-- TABELA: logs_sistema
-- Auditoria e rastreamento de ações
-- ============================================
CREATE TABLE `logs_sistema` (
  `id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,
  `user_id` INT(11) UNSIGNED DEFAULT NULL,
  `acao` VARCHAR(100) NOT NULL,
  `tabela_afetada` VARCHAR(50) DEFAULT NULL,
  `registro_id` INT(11) UNSIGNED DEFAULT NULL,
  `dados_antes` JSON DEFAULT NULL,
  `dados_depois` JSON DEFAULT NULL,
  `ip_origem` VARCHAR(45) DEFAULT NULL,
  `user_agent` TEXT DEFAULT NULL,
  `nivel` ENUM('info', 'warning', 'error', 'critical') NOT NULL DEFAULT 'info',
  `created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  KEY `user_id` (`user_id`),
  KEY `idx_acao` (`acao`),
  KEY `idx_created_at` (`created_at`),
  KEY `idx_nivel` (`nivel`),
  CONSTRAINT `fk_logs_user` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE SET NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ============================================
-- TABELA: sessoes
-- Gerenciamento de sessões de usuários
-- ============================================
CREATE TABLE `sessoes` (
  `id` VARCHAR(128) NOT NULL,
  `user_id` INT(11) UNSIGNED DEFAULT NULL,
  `ip_address` VARCHAR(45) NOT NULL,
  `user_agent` TEXT DEFAULT NULL,
  `payload` TEXT NOT NULL,
  `last_activity` INT(11) UNSIGNED NOT NULL,
  `created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  KEY `user_id` (`user_id`),
  KEY `idx_last_activity` (`last_activity`),
  CONSTRAINT `fk_sessoes_user` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ============================================
-- INSERIR CONFIGURAÇÕES PADRÃO
-- ============================================
INSERT INTO `config` (`chave`, `valor`, `tipo`, `descricao`, `categoria`, `editavel`) VALUES
('preco_cartela', '2.00', 'number', 'Preço padrão de uma cartela', 'financeiro', 1),
('comissao_afiliado', '0.10', 'number', 'Percentual de comissão para afiliados (10%)', 'afiliados', 1),
('retencao_casa', '0.30', 'number', 'Percentual de retenção da casa (30%)', 'financeiro', 1),
('premio_quina', '10.00', 'number', 'Valor padrão do prêmio de Quina', 'premios', 1),
('premio_bingo', '50.00', 'number', 'Valor padrão do prêmio de Bingo', 'premios', 1),
('max_cartelas_por_usuario', '10', 'number', 'Máximo de cartelas por usuário por jogo', 'jogo', 1),
('tempo_autovalidacao', '5', 'number', 'Tempo em segundos para autovalidação de vitória', 'jogo', 1),
('narrador_ativo', 'true', 'boolean', 'Ativar narração de voz no painel TV', 'interface', 1),
('narrador_velocidade', '0.8', 'number', 'Velocidade da narração (0.1 a 2.0)', 'interface', 1),
('pix_chave', '', 'string', 'Chave PIX para recebimento', 'financeiro', 1),
('pix_nome_recebedor', '', 'string', 'Nome do recebedor PIX', 'financeiro', 1),
('pix_cidade', '', 'string', 'Cidade do recebedor PIX', 'financeiro', 1),
('site_nome', 'Bingo Pro V2', 'string', 'Nome do site', 'geral', 1),
('site_url', 'http://localhost', 'string', 'URL do site', 'geral', 1),
('modo_manutencao', 'false', 'boolean', 'Ativar modo de manutenção', 'geral', 1);

-- ============================================
-- INSERIR USUÁRIO ADMIN PADRÃO
-- Senha: admin123 (ALTERAR EM PRODUÇÃO!)
-- ============================================
INSERT INTO `users` (`nome`, `email`, `telefone`, `senha_hash`, `tipo`, `codigo_afiliado`, `status`) VALUES
('Administrador', 'admin@bingopro.com', '00000000000', '$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', 'admin', 'ADMIN001', 'ativo');

-- ============================================
-- CRIAR ÍNDICES ADICIONAIS PARA PERFORMANCE
-- ============================================

-- Índice composto para consultas de ranking em tempo real
CREATE INDEX idx_cartelas_ranking ON cartelas(game_id, status, total_acertos DESC);

-- Índice para transações financeiras por data
CREATE INDEX idx_transacoes_data_tipo ON transacoes(created_at DESC, tipo, status);

-- Índice para comissões pendentes
CREATE INDEX idx_comissoes_pendentes ON comissoes_afiliados(afiliado_id, status, created_at DESC);

-- ============================================
-- CRIAR VIEWS PARA CONSULTAS FREQUENTES
-- ============================================

-- View: Ranking em tempo real de um jogo
CREATE OR REPLACE VIEW v_ranking_tempo_real AS
SELECT
    c.id AS cartela_id,
    c.game_id,
    c.codigo_unico,
    u.id AS user_id,
    u.nome AS jogador_nome,
    c.total_acertos,
    c.status,
    (15 - c.total_acertos) AS faltam,
    c.tipo AS tipo_cartela
FROM cartelas c
INNER JOIN users u ON c.user_id = u.id
WHERE c.status = 'ativa'
ORDER BY c.game_id, c.total_acertos DESC, c.created_at ASC;

-- View: Estatísticas gerais de jogos
CREATE OR REPLACE VIEW v_estatisticas_games AS
SELECT
    g.id AS game_id,
    g.codigo,
    g.status,
    g.data_inicio,
    g.data_fim,
    JSON_LENGTH(g.bolas_sorteadas) AS total_bolas_sorteadas,
    g.total_cartelas_vendidas,
    g.total_arrecadado,
    g.premio_quina,
    g.premio_bingo,
    CONCAT(uq.nome, ' (', uq.telefone, ')') AS vencedor_quina,
    CONCAT(ub.nome, ' (', ub.telefone, ')') AS vencedor_bingo
FROM games g
LEFT JOIN users uq ON g.vencedor_quina_id = uq.id
LEFT JOIN users ub ON g.vencedor_bingo_id = ub.id
ORDER BY g.created_at DESC;

-- View: Extrato financeiro de usuários
CREATE OR REPLACE VIEW v_extrato_usuarios AS
SELECT
    t.id AS transacao_id,
    t.user_id,
    u.nome AS usuario_nome,
    t.tipo,
    t.valor,
    t.saldo_posterior AS saldo_atual,
    t.descricao,
    t.status,
    t.created_at,
    g.codigo AS codigo_jogo
FROM transacoes t
INNER JOIN users u ON t.user_id = u.id
LEFT JOIN games g ON t.game_id = g.id
ORDER BY t.created_at DESC;

-- View: Dashboard de afiliados
CREATE OR REPLACE VIEW v_dashboard_afiliados AS
SELECT
    u.id AS afiliado_id,
    u.nome AS afiliado_nome,
    u.codigo_afiliado,
    COUNT(DISTINCT ur.id) AS total_referidos,
    COUNT(DISTINCT ca.id) AS total_comissoes,
    COALESCE(SUM(ca.valor_comissao), 0) AS total_ganho_comissoes,
    COALESCE(SUM(CASE WHEN ca.status = 'pendente' THEN ca.valor_comissao ELSE 0 END), 0) AS comissoes_pendentes,
    COALESCE(SUM(CASE WHEN ca.status = 'pago' THEN ca.valor_comissao ELSE 0 END), 0) AS comissoes_pagas
FROM users u
LEFT JOIN users ur ON ur.referido_por_id = u.id
LEFT JOIN comissoes_afiliados ca ON ca.afiliado_id = u.id
WHERE u.codigo_afiliado IS NOT NULL
GROUP BY u.id, u.nome, u.codigo_afiliado;

-- ============================================
-- TRIGGERS PARA AUTOMAÇÃO
-- ============================================

-- Trigger: Gerar código de afiliado automaticamente
DELIMITER $$
CREATE TRIGGER trg_users_codigo_afiliado
BEFORE INSERT ON users
FOR EACH ROW
BEGIN
    IF NEW.codigo_afiliado IS NULL AND NEW.tipo IN ('jogador', 'afiliado') THEN
        SET NEW.codigo_afiliado = CONCAT('AF', LPAD(FLOOR(RAND() * 999999), 6, '0'));
    END IF;
END$$
DELIMITER ;

-- Trigger: Atualizar contador de cartelas no game
DELIMITER $$
CREATE TRIGGER trg_cartelas_after_insert
AFTER INSERT ON cartelas
FOR EACH ROW
BEGIN
    UPDATE games
    SET total_cartelas_vendidas = total_cartelas_vendidas + 1,
        total_arrecadado = total_arrecadado + preco_cartela
    WHERE id = NEW.game_id;
END$$
DELIMITER ;

-- Trigger: Registrar log de transações importantes
DELIMITER $$
CREATE TRIGGER trg_transacoes_log
AFTER INSERT ON transacoes
FOR EACH ROW
BEGIN
    IF NEW.tipo IN ('premio_quina', 'premio_bingo', 'saque') THEN
        INSERT INTO logs_sistema (user_id, acao, tabela_afetada, registro_id, dados_depois, nivel)
        VALUES (NEW.user_id, CONCAT('TRANSACAO_', NEW.tipo), 'transacoes', NEW.id,
                JSON_OBJECT('tipo', NEW.tipo, 'valor', NEW.valor, 'status', NEW.status), 'info');
    END IF;
END$$
DELIMITER ;

-- ============================================
-- STORED PROCEDURES
-- ============================================

-- Procedure: Calcular e pagar comissões de afiliado
DELIMITER $$
CREATE PROCEDURE sp_processar_comissao_afiliado(
    IN p_transacao_id INT,
    IN p_user_id INT,
    IN p_valor_transacao DECIMAL(10,2)
)
BEGIN
    DECLARE v_afiliado_id INT;
    DECLARE v_percentual DECIMAL(5,2);
    DECLARE v_valor_comissao DECIMAL(10,2);

    -- Buscar o afiliado (padrinho) do usuário
    SELECT referido_por_id INTO v_afiliado_id
    FROM users
    WHERE id = p_user_id AND referido_por_id IS NOT NULL;

    IF v_afiliado_id IS NOT NULL THEN
        -- Buscar percentual de comissão configurado
        SELECT CAST(valor AS DECIMAL(5,2)) INTO v_percentual
        FROM config
        WHERE chave = 'comissao_afiliado';

        -- Calcular valor da comissão
        SET v_valor_comissao = p_valor_transacao * v_percentual;

        -- Registrar comissão
        INSERT INTO comissoes_afiliados (afiliado_id, referido_id, transacao_id, valor_transacao, percentual_comissao, valor_comissao, status)
        VALUES (v_afiliado_id, p_user_id, p_transacao_id, p_valor_transacao, v_percentual, v_valor_comissao, 'pendente');

        -- Atualizar saldo do afiliado
        UPDATE users
        SET saldo = saldo + v_valor_comissao
        WHERE id = v_afiliado_id;

        -- Registrar transação de comissão
        INSERT INTO transacoes (user_id, tipo, valor, saldo_anterior, saldo_posterior, descricao, status)
        SELECT v_afiliado_id, 'comissao_afiliado', v_valor_comissao,
               saldo - v_valor_comissao, saldo,
               CONCAT('Comissão por indicação - Transação #', p_transacao_id), 'aprovado'
        FROM users WHERE id = v_afiliado_id;
    END IF;
END$$
DELIMITER ;

-- Procedure: Validar cartela vencedora
DELIMITER $$
CREATE PROCEDURE sp_validar_cartela_vencedora(
    IN p_cartela_id INT,
    IN p_tipo_premio ENUM('quina', 'bingo'),
    IN p_validador_id INT
)
BEGIN
    DECLARE v_user_id INT;
    DECLARE v_game_id INT;
    DECLARE v_valor_premio DECIMAL(10,2);
    DECLARE v_saldo_anterior DECIMAL(10,2);

    -- Buscar dados da cartela
    SELECT user_id, game_id INTO v_user_id, v_game_id
    FROM cartelas
    WHERE id = p_cartela_id;

    -- Buscar valor do prêmio
    IF p_tipo_premio = 'quina' THEN
        SELECT premio_quina INTO v_valor_premio FROM games WHERE id = v_game_id;
    ELSE
        SELECT premio_bingo INTO v_valor_premio FROM games WHERE id = v_game_id;
    END IF;

    -- Atualizar cartela
    UPDATE cartelas
    SET status = p_tipo_premio,
        validada_por = p_validador_id
    WHERE id = p_cartela_id;

    -- Atualizar game
    IF p_tipo_premio = 'quina' THEN
        UPDATE games SET vencedor_quina_id = v_user_id, status = 'pausado' WHERE id = v_game_id;
    ELSE
        UPDATE games SET vencedor_bingo_id = v_user_id, status = 'finalizado' WHERE id = v_game_id;
    END IF;

    -- Buscar saldo anterior
    SELECT saldo INTO v_saldo_anterior FROM users WHERE id = v_user_id;

    -- Creditar prêmio ao usuário
    UPDATE users
    SET saldo = saldo + v_valor_premio,
        total_ganho = total_ganho + v_valor_premio
    WHERE id = v_user_id;

    -- Registrar transação
    INSERT INTO transacoes (user_id, game_id, tipo, valor, saldo_anterior, saldo_posterior, descricao, status, aprovado_por, data_aprovacao)
    VALUES (v_user_id, v_game_id,
            IF(p_tipo_premio = 'quina', 'premio_quina', 'premio_bingo'),
            v_valor_premio, v_saldo_anterior, v_saldo_anterior + v_valor_premio,
            CONCAT('Prêmio de ', UPPER(p_tipo_premio), ' - Jogo #', v_game_id),
            'aprovado', p_validador_id, NOW());
END$$
DELIMITER ;

-- ============================================
-- FINALIZAÇÃO
-- ============================================

COMMIT;

-- Exibir resumo
SELECT 'DATABASE CRIADO COM SUCESSO!' AS status;
SELECT TABLE_NAME, TABLE_ROWS
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = 'bingo_pro_v2'
ORDER BY TABLE_NAME;
