USE null_terminal;

SET @add_entry_fee := (
    SELECT IF(COUNT(*) = 0,
        'ALTER TABLE challenges ADD COLUMN entry_fee_coins INT NOT NULL DEFAULT 0 AFTER points',
        'SELECT 1')
    FROM information_schema.columns
    WHERE table_schema = DATABASE() AND table_name = 'challenges' AND column_name = 'entry_fee_coins'
);
PREPARE stmt_entry_fee FROM @add_entry_fee;
EXECUTE stmt_entry_fee;
DEALLOCATE PREPARE stmt_entry_fee;

SET @add_host_id := (
    SELECT IF(COUNT(*) = 0,
        'ALTER TABLE challenges ADD COLUMN host_id INT DEFAULT NULL AFTER created_by',
        'SELECT 1')
    FROM information_schema.columns
    WHERE table_schema = DATABASE() AND table_name = 'challenges' AND column_name = 'host_id'
);
PREPARE stmt_host_id FROM @add_host_id;
EXECUTE stmt_host_id;
DEALLOCATE PREPARE stmt_host_id;

CREATE TABLE IF NOT EXISTS wallet_transactions (
    id INT AUTO_INCREMENT PRIMARY KEY, user_id INT NOT NULL,
    type ENUM('topup','coin_purchase','challenge_entry','challenge_reward','admin_grant','admin_debit','refund') NOT NULL,
    amount_minor BIGINT NOT NULL DEFAULT 0, coins_delta INT NOT NULL DEFAULT 0,
    balance_after INT NOT NULL DEFAULT 0, reference VARCHAR(120) UNIQUE DEFAULT NULL,
    description VARCHAR(255) NOT NULL, metadata JSON DEFAULT NULL,
    created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
) ENGINE=InnoDB;

CREATE TABLE IF NOT EXISTS paystack_transactions (
    id INT AUTO_INCREMENT PRIMARY KEY, user_id INT NOT NULL,
    reference VARCHAR(120) UNIQUE NOT NULL, access_code VARCHAR(120) DEFAULT NULL,
    amount_minor BIGINT NOT NULL, currency VARCHAR(8) NOT NULL DEFAULT 'NGN',
    email VARCHAR(150) NOT NULL, mobile_number VARCHAR(40) DEFAULT NULL,
    status ENUM('initialized','success','failed','abandoned') NOT NULL DEFAULT 'initialized',
    gateway_response VARCHAR(255) DEFAULT NULL, raw_response JSON DEFAULT NULL,
    verified_at DATETIME DEFAULT NULL, created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
) ENGINE=InnoDB;

CREATE TABLE IF NOT EXISTS challenge_participants (
    id INT AUTO_INCREMENT PRIMARY KEY, challenge_id INT NOT NULL, user_id INT NOT NULL,
    entry_fee_coins INT NOT NULL DEFAULT 0,
    status ENUM('joined','withdrawn','disqualified') NOT NULL DEFAULT 'joined',
    joined_at DATETIME DEFAULT CURRENT_TIMESTAMP,
    UNIQUE KEY unique_participant (challenge_id, user_id),
    FOREIGN KEY (challenge_id) REFERENCES challenges(id) ON DELETE CASCADE,
    FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
) ENGINE=InnoDB;

CREATE TABLE IF NOT EXISTS challenge_results (
    id INT AUTO_INCREMENT PRIMARY KEY, challenge_id INT NOT NULL, user_id INT NOT NULL,
    position TINYINT NOT NULL, point_multiplier DECIMAL(3,2) NOT NULL,
    points_awarded DECIMAL(10,2) NOT NULL DEFAULT 0, coins_awarded INT NOT NULL DEFAULT 0,
    announced_by INT NOT NULL, announced_at DATETIME DEFAULT CURRENT_TIMESTAMP,
    UNIQUE KEY unique_result_position (challenge_id, position),
    UNIQUE KEY unique_result_user (challenge_id, user_id),
    FOREIGN KEY (challenge_id) REFERENCES challenges(id) ON DELETE CASCADE,
    FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE,
    FOREIGN KEY (announced_by) REFERENCES users(id)
) ENGINE=InnoDB;