-- ============================================================
-- BETKOOS - Schema Completo v1.0
-- ============================================================

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ------------------------------------------------------------
-- TABELA: users (jogadores + admins)
-- ------------------------------------------------------------
CREATE TABLE IF NOT EXISTS `users` (
    `id` INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    `phone` VARCHAR(20) NOT NULL UNIQUE,
    `phone_country` VARCHAR(5) DEFAULT '+258',
    `password_hash` VARCHAR(255) NOT NULL,
    `email` VARCHAR(150) NULL,
    `name` VARCHAR(100) NULL,
    `currency` ENUM('MZN','AOA','USD') DEFAULT 'MZN',
    `balance` DECIMAL(18,2) DEFAULT 0.00,
    `bonus_balance` DECIMAL(18,2) DEFAULT 0.00,
    `role` ENUM('player','affiliate','admin') DEFAULT 'player',
    `affiliate_id` INT UNSIGNED NULL,
    `kyc_status` ENUM('none','pending','approved','rejected') DEFAULT 'none',
    `is_blocked` TINYINT(1) DEFAULT 0,
    `block_reason` VARCHAR(255) NULL,
    `last_login` DATETIME NULL,
    `last_ip` VARCHAR(45) NULL,
    `created_at` DATETIME DEFAULT CURRENT_TIMESTAMP,
    `updated_at` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    INDEX `idx_phone` (`phone`),
    INDEX `idx_role` (`role`),
    INDEX `idx_affiliate` (`affiliate_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ------------------------------------------------------------
-- TABELA: system_settings (⭐ CONFIGURAÇÕES DINÂMICAS)
-- ------------------------------------------------------------
CREATE TABLE IF NOT EXISTS `system_settings` (
    `id` INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    `setting_key` VARCHAR(100) NOT NULL UNIQUE,
    `setting_value` TEXT NOT NULL,
    `setting_type` ENUM('string','number','boolean','json') DEFAULT 'string',
    `setting_group` VARCHAR(50) NOT NULL,
    `setting_label` VARCHAR(150) NOT NULL,
    `setting_description` VARCHAR(255) NULL,
    `is_public` TINYINT(1) DEFAULT 0,
    `updated_at` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    INDEX `idx_group` (`setting_group`),
    INDEX `idx_key` (`setting_key`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ------------------------------------------------------------
-- TABELA: game_settings (controle de RTP por jogo)
-- ------------------------------------------------------------
CREATE TABLE IF NOT EXISTS `game_settings` (
    `id` INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    `game_key` VARCHAR(50) NOT NULL UNIQUE,
    `game_name` VARCHAR(100) NOT NULL,
    `is_active` TINYINT(1) DEFAULT 1,
    `rtp_mode` ENUM('easy','advanced') DEFAULT 'easy',
    `house_edge_percent` DECIMAL(5,2) DEFAULT 4.00,
    `prob_easy` DECIMAL(5,2) DEFAULT 50.00,
    `prob_medium` DECIMAL(5,2) DEFAULT 40.00,
    `prob_hard` DECIMAL(5,2) DEFAULT 10.00,
    `min_bet` DECIMAL(18,2) DEFAULT 1.00,
    `max_bet` DECIMAL(18,2) DEFAULT 10000.00,
    `max_win` DECIMAL(18,2) DEFAULT 100000.00,
    `total_bets` DECIMAL(18,2) DEFAULT 0.00,
    `total_payouts` DECIMAL(18,2) DEFAULT 0.00,
    `updated_at` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    INDEX `idx_key` (`game_key`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ------------------------------------------------------------
-- TABELA: transactions (depósitos e saques)
-- ------------------------------------------------------------
CREATE TABLE IF NOT EXISTS `transactions` (
    `id` BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    `transaction_id` VARCHAR(50) NOT NULL UNIQUE,
    `user_id` INT UNSIGNED NOT NULL,
    `type` ENUM('deposit','withdraw') NOT NULL,
    `method` ENUM('mpesa','emola','card','paypal','bank') NOT NULL,
    `amount` DECIMAL(18,2) NOT NULL,
    `fee` DECIMAL(18,2) DEFAULT 0.00,
    `net_amount` DECIMAL(18,2) NOT NULL,
    `currency` VARCHAR(3) DEFAULT 'MZN',
    `status` ENUM('pending','processing','success','failed','cancelled') DEFAULT 'pending',
    `zumbo_reference` VARCHAR(50) NULL,
    `zumbo_provider_ref` VARCHAR(100) NULL,
    `zumbo_status` VARCHAR(30) NULL,
    `source_id` VARCHAR(100) NULL,
    `customer_name` VARCHAR(150) NULL,
    `msisdn` VARCHAR(20) NULL,
    `checkout_url` TEXT NULL,
    `notes` TEXT NULL,
    `requested_at` DATETIME DEFAULT CURRENT_TIMESTAMP,
    `confirmed_at` DATETIME NULL,
    `completed_at` DATETIME NULL,
    INDEX `idx_user` (`user_id`),
    INDEX `idx_status` (`status`),
    INDEX `idx_type` (`type`),
    INDEX `idx_zumbo_ref` (`zumbo_reference`),
    INDEX `idx_created` (`requested_at`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ------------------------------------------------------------
-- TABELA: bets (apostas dos jogos)
-- ------------------------------------------------------------
CREATE TABLE IF NOT EXISTS `bets` (
    `id` BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    `bet_id` VARCHAR(50) NOT NULL UNIQUE,
    `user_id` INT UNSIGNED NOT NULL,
    `game_key` VARCHAR(50) NOT NULL,
    `bet_amount` DECIMAL(18,2) NOT NULL,
    `multiplier` DECIMAL(10,2) DEFAULT 1.00,
    `win_amount` DECIMAL(18,2) DEFAULT 0.00,
    `is_win` TINYINT(1) DEFAULT 0,
    `is_freebet` TINYINT(1) DEFAULT 0,
    `bet_data` JSON NULL,
    `created_at` DATETIME DEFAULT CURRENT_TIMESTAMP,
    `resolved_at` DATETIME NULL,
    INDEX `idx_user` (`user_id`),
    INDEX `idx_game` (`game_key`),
    INDEX `idx_created` (`created_at`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ------------------------------------------------------------
-- TABELA: affiliates (afiliados)
-- ------------------------------------------------------------
CREATE TABLE IF NOT EXISTS `affiliates` (
    `id` INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    `user_id` INT UNSIGNED NOT NULL UNIQUE,
    `referral_code` VARCHAR(20) NOT NULL UNIQUE,
    `commission_percent` DECIMAL(5,2) DEFAULT 25.00,
    `total_earned` DECIMAL(18,2) DEFAULT 0.00,
    `total_paid` DECIMAL(18,2) DEFAULT 0.00,
    `is_active` TINYINT(1) DEFAULT 1,
    `created_at` DATETIME DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (`user_id`) REFERENCES `users`(`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ------------------------------------------------------------
-- TABELA: affiliate_earnings (comissões mensais)
-- ------------------------------------------------------------
CREATE TABLE IF NOT EXISTS `affiliate_earnings` (
    `id` BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    `affiliate_id` INT UNSIGNED NOT NULL,
    `player_id` INT UNSIGNED NOT NULL,
    `period_month` VARCHAR(7) NOT NULL,
    `player_bets` DECIMAL(18,2) DEFAULT 0.00,
    `player_wins` DECIMAL(18,2) DEFAULT 0.00,
    `net_loss` DECIMAL(18,2) DEFAULT 0.00,
    `commission` DECIMAL(18,2) DEFAULT 0.00,
    `status` ENUM('pending','paid') DEFAULT 'pending',
    `paid_at` DATETIME NULL,
    `created_at` DATETIME DEFAULT CURRENT_TIMESTAMP,
    UNIQUE KEY `unique_period` (`affiliate_id`, `player_id`, `period_month`),
    INDEX `idx_affiliate` (`affiliate_id`),
    INDEX `idx_period` (`period_month`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ------------------------------------------------------------
-- TABELA: bonuses (bónus ativos)
-- ------------------------------------------------------------
CREATE TABLE IF NOT EXISTS `bonuses` (
    `id` BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    `user_id` INT UNSIGNED NOT NULL,
    `type` ENUM('welcome','deposit','freebet','cashback','referral') NOT NULL,
    `amount` DECIMAL(18,2) NOT NULL,
    `wagering_required` DECIMAL(18,2) DEFAULT 0.00,
    `wagering_done` DECIMAL(18,2) DEFAULT 0.00,
    `description` VARCHAR(255) NULL,
    `expires_at` DATETIME NULL,
    `status` ENUM('active','completed','expired','cancelled') DEFAULT 'active',
    `created_at` DATETIME DEFAULT CURRENT_TIMESTAMP,
    INDEX `idx_user` (`user_id`),
    INDEX `idx_status` (`status`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ------------------------------------------------------------
-- TABELA: payment_gateways (APIs ZumboPay/PayPal)
-- ------------------------------------------------------------
CREATE TABLE IF NOT EXISTS `payment_gateways` (
    `id` INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    `gateway_key` VARCHAR(50) NOT NULL UNIQUE,
    `gateway_name` VARCHAR(100) NOT NULL,
    `is_active` TINYINT(1) DEFAULT 1,
    `api_key_encrypted` TEXT NULL,
    `api_secret_encrypted` TEXT NULL,
    `merchant_id` VARCHAR(100) NULL,
    `webhook_secret_encrypted` TEXT NULL,
    `environment` ENUM('test','live') DEFAULT 'test',
    `base_url` VARCHAR(255) NULL,
    `wallets_config` JSON NULL,
    `last_test_at` DATETIME NULL,
    `last_test_result` ENUM('success','failed') NULL,
    `last_test_message` TEXT NULL,
    `created_at` DATETIME DEFAULT CURRENT_TIMESTAMP,
    `updated_at` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ------------------------------------------------------------
-- TABELA: webhook_logs (auditoria)
-- ------------------------------------------------------------
CREATE TABLE IF NOT EXISTS `webhook_logs` (
    `id` BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    `provider` VARCHAR(30) NOT NULL,
    `event_type` VARCHAR(50) NOT NULL,
    `reference` VARCHAR(50) NULL,
    `payload` JSON NOT NULL,
    `signature_valid` TINYINT(1) DEFAULT 0,
    `processed` TINYINT(1) DEFAULT 0,
    `created_at` DATETIME DEFAULT CURRENT_TIMESTAMP,
    INDEX `idx_provider` (`provider`),
    INDEX `idx_reference` (`reference`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ------------------------------------------------------------
-- TABELA: api_logs (logs de chamadas a APIs)
-- ------------------------------------------------------------
CREATE TABLE IF NOT EXISTS `api_logs` (
    `id` BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    `gateway_key` VARCHAR(50) NOT NULL,
    `endpoint` VARCHAR(255) NOT NULL,
    `method` ENUM('GET','POST','PUT','DELETE') NOT NULL,
    `request_data` JSON NULL,
    `response_data` JSON NULL,
    `http_code` INT NULL,
    `execution_time_ms` INT NULL,
    `status` ENUM('success','error') NOT NULL,
    `error_message` TEXT NULL,
    `ip_address` VARCHAR(45) NULL,
    `created_at` DATETIME DEFAULT CURRENT_TIMESTAMP,
    INDEX `idx_gateway` (`gateway_key`),
    INDEX `idx_created` (`created_at`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ------------------------------------------------------------
-- TABELA: admin_logs (auditoria de ações admin)
-- ------------------------------------------------------------
CREATE TABLE IF NOT EXISTS `admin_logs` (
    `id` BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    `admin_id` INT UNSIGNED NOT NULL,
    `action` VARCHAR(100) NOT NULL,
    `target_type` VARCHAR(50) NULL,
    `target_id` INT UNSIGNED NULL,
    `details` JSON NULL,
    `ip_address` VARCHAR(45) NULL,
    `created_at` DATETIME DEFAULT CURRENT_TIMESTAMP,
    INDEX `idx_admin` (`admin_id`),
    INDEX `idx_action` (`action`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ============================================================
-- DADOS INICIAIS (SEEDS)
-- ============================================================

-- ------------------------------------------------------------
-- ⭐ CONFIGURAÇÕES DO SISTEMA (TUDO CONFIGURÁVEL)
-- ------------------------------------------------------------
INSERT INTO `system_settings` (`setting_key`, `setting_value`, `setting_type`, `setting_group`, `setting_label`, `setting_description`, `is_public`) VALUES

-- 💰 DEPÓSITOS
('deposit_min_mzn', '50', 'number', 'deposits', 'Depósito Mínimo (MZN)', 'Valor mínimo para depósito em Meticais', 1),
('deposit_max_mzn', '500000', 'number', 'deposits', 'Depósito Máximo (MZN)', 'Valor máximo para depósito em Meticais', 1),
('deposit_min_aoa', '500', 'number', 'deposits', 'Depósito Mínimo (AOA)', 'Valor mínimo para depósito em Kwanzas', 1),
('deposit_max_aoa', '5000000', 'number', 'deposits', 'Depósito Máximo (AOA)', 'Valor máximo para depósito em Kwanzas', 1),
('deposit_min_usd', '1', 'number', 'deposits', 'Depósito Mínimo (USD)', 'Valor mínimo para depósito em Dólares', 1),
('deposit_max_usd', '10000', 'number', 'deposits', 'Depósito Máximo (USD)', 'Valor máximo para depósito em Dólares', 1),

-- 💸 SAQUES
('withdraw_min_mzn', '100', 'number', 'withdrawals', 'Saque Mínimo (MZN)', 'Valor mínimo para saque em Meticais', 1),
('withdraw_max_mzn', '1000000', 'number', 'withdrawals', 'Saque Máximo (MZN)', 'Valor máximo para saque em Meticais', 1),
('withdraw_min_aoa', '1000', 'number', 'withdrawals', 'Saque Mínimo (AOA)', 'Valor mínimo para saque em Kwanzas', 1),
('withdraw_max_aoa', '10000000', 'number', 'withdrawals', 'Saque Máximo (AOA)', 'Valor máximo para saque em Kwanzas', 1),
('withdraw_min_usd', '2', 'number', 'withdrawals', 'Saque Mínimo (USD)', 'Valor mínimo para saque em Dólares', 1),
('withdraw_max_usd', '20000', 'number', 'withdrawals', 'Saque Máximo (USD)', 'Valor máximo para saque em Dólares', 1),
('withdraw_fee_percent', '6', 'number', 'withdrawals', 'Taxa de Saque (%)', 'Percentual de taxa para saques', 0),
('withdraw_auto_approve_max', '5000', 'number', 'withdrawals', 'Aprovação Automática Até', 'Saques até este valor são aprovados automaticamente', 0),

-- 🎮 APOSTAS (GLOBAIS)
('bet_min_mzn', '5', 'number', 'bets', 'Aposta Mínima (MZN)', 'Valor mínimo para aposta em Meticais', 1),
('bet_max_mzn', '50000', 'number', 'bets', 'Aposta Máxima (MZN)', 'Valor máximo para aposta em Meticais', 1),
('bet_min_aoa', '50', 'number', 'bets', 'Aposta Mínima (AOA)', 'Valor mínimo para aposta em Kwanzas', 1),
('bet_max_aoa', '500000', 'number', 'bets', 'Aposta Máxima (AOA)', 'Valor máximo para aposta em Kwanzas', 1),
('bet_min_usd', '0.10', 'number', 'bets', 'Aposta Mínima (USD)', 'Valor mínimo para aposta em Dólares', 1),
('bet_max_usd', '1000', 'number', 'bets', 'Aposta Máxima (USD)', 'Valor máximo para aposta em Dólares', 1),
('max_win_multiplier', '100', 'number', 'bets', 'Ganho Máximo (multiplicador)', 'Multiplicador máximo de ganho por aposta', 0),

-- 🎁 BÓNUS
('welcome_bonus_percent', '100', 'number', 'bonuses', 'Bónus Boas-Vindas (%)', 'Percentagem do bónus no primeiro depósito', 1),
('welcome_bonus_max_mzn', '5000', 'number', 'bonuses', 'Bónus Máximo (MZN)', 'Valor máximo do bónus de boas-vindas', 1),
('welcome_wagering', '30', 'number', 'bonuses', 'Rollover do Bónus', 'Quantas vezes o bónus deve ser apostado', 0),
('welcome_bonus_validity_days', '7', 'number', 'bonuses', 'Validade do Bónus (dias)', 'Dias para usar o bónus antes de expirar', 0),

-- 🤝 AFILIADOS
('affiliate_commission_percent', '25', 'number', 'affiliates', 'Comissão de Afiliado (%)', 'Percentagem fixa de RevShare vitalício', 0),
('affiliate_min_withdraw_mzn', '500', 'number', 'affiliates', 'Saque Mínimo Afiliado (MZN)', 'Valor mínimo para afiliado sacar comissão', 0),

-- ⚙️ GERAL
('site_name', 'BetKoos', 'string', 'general', 'Nome do Site', 'Nome exibido no site', 1),
('site_currency_default', 'MZN', 'string', 'general', 'Moeda Padrão', 'Moeda padrão para novos registos', 1),
('maintenance_mode', '0', 'boolean', 'general', 'Modo Manutenção', 'Ativar/desativar modo manutenção', 0),
('min_age', '18', 'number', 'general', 'Idade Mínima', 'Idade mínima para jogar', 1),
('kyc_required_above', '10000', 'number', 'general', 'KYC Obrigatório Acima de', 'Valor de saque que exige KYC', 0),

-- 🔒 SEGURANÇA
('max_login_attempts', '5', 'number', 'security', 'Máximo de Tentativas Login', 'Bloqueia após X tentativas falhas', 0),
('login_lockout_minutes', '15', 'number', 'security', 'Tempo de Bloqueio (min)', 'Minutos de bloqueio após falhas', 0),
('session_timeout_minutes', '60', 'number', 'security', 'Timeout da Sessão (min)', 'Minutos até sessão expirar', 0),
('require_2fa_admin', '1', 'boolean', 'security', '2FA Obrigatório para Admin', 'Exigir autenticação 2FA para admins', 0);

-- ------------------------------------------------------------
-- JOGOS PADRÃO
-- ------------------------------------------------------------
INSERT INTO `game_settings` (`game_key`, `game_name`, `house_edge_percent`, `prob_easy`, `prob_medium`, `prob_hard`, `min_bet`, `max_bet`, `max_win`) VALUES
('aviator', 'Aviator', 4.00, 50.00, 40.00, 10.00, 5.00, 50000.00, 500000.00),
('tower', 'Tower', 3.00, 60.00, 30.00, 10.00, 5.00, 50000.00, 500000.00),
('twinspin', 'Twin Spin', 5.00, 70.00, 25.00, 5.00, 25.00, 100000.00, 1000000.00),
('trader', 'Trader', 2.50, 55.00, 35.00, 10.00, 5.00, 50000.00, 500000.00),
('mines', 'Mines', 3.50, 60.00, 30.00, 10.00, 5.00, 50000.00, 500000.00),
('plinko', 'Plinko', 4.00, 50.00, 40.00, 10.00, 5.00, 50000.00, 500000.00);

-- ------------------------------------------------------------
-- GATEWAYS DE PAGAMENTO (vazios — admin preenche)
-- ------------------------------------------------------------
INSERT INTO `payment_gateways` (`gateway_key`, `gateway_name`, `environment`, `base_url`) VALUES
('zumopay', 'Zumbo Pay', 'test', 'https://zumbopay.com/api/public/v1'),
('paypal', 'PayPal', 'sandbox', 'https://api-m.sandbox.paypal.com');

SET FOREIGN_KEY_CHECKS = 1;