import SlotGameEngine, { SlotGameConfig, SlotSymbol } from './slotGameEngine.js';

export interface SlotGameGeneratorConfig {
  gameName: string;
  reels: number;
  rows: number;
  rtp: number;
  volatility: 'low' | 'medium' | 'high';
  features: string[];
  theme: string;
  bonus?: {
    trigger: 'scatter' | 'bonus' | 'collector';
    spins: number;
    retrigger: boolean;
  };
}

class SlotGameGenerator {
  /**
   * Generate a slot game from configuration
   */
  static generateGame(config: SlotGameGeneratorConfig): SlotGameEngine {
    const gameId = `game-${Date.now()}`;
    const symbols = this.generateSymbols(config.theme, config.features);
    const paylines = this.calculatePaylines(config.reels, config.rows);

    const gameConfig: SlotGameConfig = {
      gameId,
      gameName: config.gameName,
      reels: config.reels,
      rows: config.rows,
      paylines,
      minBet: 0.1,
      maxBet: 100,
      rtp: config.rtp,
      volatility: config.volatility,
      symbols,
      features: config.features,
      bonusConfig: config.bonus,
      cascadingReels: config.features.includes('cascading_reels'),
      clusterPays: config.features.includes('cluster_pays'),
      megaways: config.features.includes('megaways'),
    };

    return new SlotGameEngine(gameConfig);
  }

  /**
   * Generate symbols based on theme
   */
  private static generateSymbols(theme: string, features: string[]): SlotSymbol[] {
    const symbolSets: Record<string, SlotSymbol[]> = {
      fishing: [
        { id: 'fish1', name: 'Small Fish', value: 5, multiplier: 1, isWild: false, isScatter: false, isBonus: false },
        { id: 'fish2', name: 'Medium Fish', value: 10, multiplier: 1, isWild: false, isScatter: false, isBonus: false },
        { id: 'fish3', name: 'Large Fish', value: 25, multiplier: 1, isWild: false, isScatter: false, isBonus: false },
        { id: 'net', name: 'Fishing Net', value: 50, multiplier: 2, isWild: true, isScatter: false, isBonus: false },
        { id: 'boat', name: 'Boat', value: 100, multiplier: 3, isWild: false, isScatter: true, isBonus: false },
        { id: 'treasure', name: 'Treasure Chest', value: 200, multiplier: 1, isWild: false, isScatter: false, isBonus: true },
        { id: 'water', name: 'Water', value: 2, multiplier: 1, isWild: false, isScatter: false, isBonus: false },
        { id: 'coral', name: 'Coral', value: 15, multiplier: 1, isWild: false, isScatter: false, isBonus: false },
      ],
      dragon: [
        { id: 'dragon', name: 'Dragon', value: 200, multiplier: 3, isWild: true, isScatter: false, isBonus: false },
        { id: 'gold', name: 'Gold Coin', value: 100, multiplier: 2, isWild: false, isScatter: false, isBonus: false },
        { id: 'gem', name: 'Gem', value: 50, multiplier: 1, isWild: false, isScatter: true, isBonus: false },
        { id: 'treasure', name: 'Treasure', value: 150, multiplier: 2, isWild: false, isScatter: false, isBonus: true },
        { id: 'sword', name: 'Sword', value: 30, multiplier: 1, isWild: false, isScatter: false, isBonus: false },
        { id: 'shield', name: 'Shield', value: 25, multiplier: 1, isWild: false, isScatter: false, isBonus: false },
        { id: 'crown', name: 'Crown', value: 75, multiplier: 1, isWild: false, isScatter: false, isBonus: false },
        { id: 'flame', name: 'Flame', value: 10, multiplier: 1, isWild: false, isScatter: false, isBonus: false },
      ],
      space: [
        { id: 'planet', name: 'Planet', value: 100, multiplier: 2, isWild: false, isScatter: true, isBonus: false },
        { id: 'star', name: 'Star', value: 50, multiplier: 1, isWild: false, isScatter: false, isBonus: false },
        { id: 'rocket', name: 'Rocket', value: 150, multiplier: 3, isWild: true, isScatter: false, isBonus: false },
        { id: 'alien', name: 'Alien', value: 200, multiplier: 2, isWild: false, isScatter: false, isBonus: true },
        { id: 'moon', name: 'Moon', value: 75, multiplier: 1, isWild: false, isScatter: false, isBonus: false },
        { id: 'ufo', name: 'UFO', value: 125, multiplier: 2, isWild: false, isScatter: false, isBonus: false },
        { id: 'comet', name: 'Comet', value: 30, multiplier: 1, isWild: false, isScatter: false, isBonus: false },
        { id: 'galaxy', name: 'Galaxy', value: 10, multiplier: 1, isWild: false, isScatter: false, isBonus: false },
      ],
      neon: [
        { id: 'neon_a', name: 'Neon A', value: 20, multiplier: 1, isWild: false, isScatter: false, isBonus: false },
        { id: 'neon_k', name: 'Neon K', value: 20, multiplier: 1, isWild: false, isScatter: false, isBonus: false },
        { id: 'neon_q', name: 'Neon Q', value: 30, multiplier: 1, isWild: false, isScatter: false, isBonus: false },
        { id: 'neon_j', name: 'Neon J', value: 30, multiplier: 1, isWild: false, isScatter: false, isBonus: false },
        { id: 'neon_10', name: 'Neon 10', value: 15, multiplier: 1, isWild: false, isScatter: false, isBonus: false },
        { id: 'wild', name: 'Wild', value: 100, multiplier: 3, isWild: true, isScatter: false, isBonus: false },
        { id: 'scatter', name: 'Scatter', value: 50, multiplier: 1, isWild: false, isScatter: true, isBonus: false },
        { id: 'bonus', name: 'Bonus', value: 150, multiplier: 2, isWild: false, isScatter: false, isBonus: true },
      ],
      forest: [
        { id: 'tree', name: 'Tree', value: 30, multiplier: 1, isWild: false, isScatter: false, isBonus: false },
        { id: 'mushroom', name: 'Mushroom', value: 25, multiplier: 1, isWild: false, isScatter: false, isBonus: false },
        { id: 'butterfly', name: 'Butterfly', value: 50, multiplier: 1, isWild: false, isScatter: true, isBonus: false },
        { id: 'fairy', name: 'Fairy', value: 100, multiplier: 2, isWild: true, isScatter: false, isBonus: false },
        { id: 'flower', name: 'Flower', value: 20, multiplier: 1, isWild: false, isScatter: false, isBonus: false },
        { id: 'bird', name: 'Bird', value: 40, multiplier: 1, isWild: false, isScatter: false, isBonus: false },
        { id: 'deer', name: 'Deer', value: 75, multiplier: 1, isWild: false, isScatter: false, isBonus: false },
        { id: 'treasure', name: 'Treasure', value: 150, multiplier: 2, isWild: false, isScatter: false, isBonus: true },
      ],
      ancient: [
        { id: 'scarab', name: 'Scarab', value: 30, multiplier: 1, isWild: false, isScatter: false, isBonus: false },
        { id: 'sphinx', name: 'Sphinx', value: 100, multiplier: 2, isWild: true, isScatter: false, isBonus: false },
        { id: 'pyramid', name: 'Pyramid', value: 75, multiplier: 1, isWild: false, isScatter: true, isBonus: false },
        { id: 'pharaoh', name: 'Pharaoh', value: 200, multiplier: 3, isWild: false, isScatter: false, isBonus: true },
        { id: 'gold_coin', name: 'Gold Coin', value: 50, multiplier: 1, isWild: false, isScatter: false, isBonus: false },
        { id: 'ankh', name: 'Ankh', value: 40, multiplier: 1, isWild: false, isScatter: false, isBonus: false },
        { id: 'eye', name: 'Eye of Horus', value: 60, multiplier: 1, isWild: false, isScatter: false, isBonus: false },
        { id: 'scroll', name: 'Scroll', value: 20, multiplier: 1, isWild: false, isScatter: false, isBonus: false },
      ],
    };

    return symbolSets[theme] || symbolSets['neon'];
  }

  /**
   * Calculate paylines based on reels and rows
   */
  private static calculatePaylines(reels: number, rows: number): number {
    // Standard payline calculation
    if (reels === 3 && rows === 1) return 1;
    if (reels === 3 && rows === 3) return 5;
    if (reels === 5 && rows === 3) return 9;
    if (reels === 5 && rows === 4) return 25;
    if (reels === 6 && rows === 4) return 50;

    // Default: 243 ways to win (Megaways style)
    return 243;
  }

  /**
   * Generate prebuilt games
   */
  static generatePrebuiltGames(): SlotGameEngine[] {
    const games: SlotGameEngine[] = [];

    // Game 1: Fishing Fortune
    games.push(
      this.generateGame({
        gameName: 'Fishing Fortune',
        reels: 5,
        rows: 3,
        rtp: 96.2,
        volatility: 'high',
        features: ['free_spins', 'collector', 'cascading_reels'],
        theme: 'fishing',
        bonus: { trigger: 'scatter', spins: 10, retrigger: true },
      })
    );

    // Game 2: Dragon's Hoard
    games.push(
      this.generateGame({
        gameName: "Dragon's Hoard",
        reels: 5,
        rows: 3,
        rtp: 95.8,
        volatility: 'high',
        features: ['free_spins', 'expanding_symbols', 'sticky_wilds'],
        theme: 'dragon',
        bonus: { trigger: 'bonus', spins: 15, retrigger: true },
      })
    );

    // Game 3: Cosmic Reels
    games.push(
      this.generateGame({
        gameName: 'Cosmic Reels',
        reels: 5,
        rows: 4,
        rtp: 96.5,
        volatility: 'medium',
        features: ['free_spins', 'megaways', 'multipliers'],
        theme: 'space',
        bonus: { trigger: 'scatter', spins: 12, retrigger: false },
      })
    );

    // Game 4: Neon Nights
    games.push(
      this.generateGame({
        gameName: 'Neon Nights',
        reels: 5,
        rows: 3,
        rtp: 95.5,
        volatility: 'low',
        features: ['free_spins', 'cluster_pays', 'multipliers'],
        theme: 'neon',
        bonus: { trigger: 'scatter', spins: 8, retrigger: false },
      })
    );

    // Game 5: Forest Magic
    games.push(
      this.generateGame({
        gameName: 'Forest Magic',
        reels: 5,
        rows: 3,
        rtp: 96.0,
        volatility: 'medium',
        features: ['free_spins', 'expanding_symbols', 'cascading_reels'],
        theme: 'forest',
        bonus: { trigger: 'scatter', spins: 10, retrigger: true },
      })
    );

    // Game 6: Ancient Riches
    games.push(
      this.generateGame({
        gameName: 'Ancient Riches',
        reels: 5,
        rows: 3,
        rtp: 96.3,
        volatility: 'high',
        features: ['free_spins', 'multipliers', 'sticky_wilds'],
        theme: 'ancient',
        bonus: { trigger: 'bonus', spins: 12, retrigger: true },
      })
    );

    // Game 7: Classic Fruits
    games.push(
      this.generateGame({
        gameName: 'Classic Fruits',
        reels: 3,
        rows: 3,
        rtp: 94.5,
        volatility: 'low',
        features: ['free_spins'],
        theme: 'neon',
        bonus: { trigger: 'scatter', spins: 5, retrigger: false },
      })
    );

    // Game 8: Treasure Hunt
    games.push(
      this.generateGame({
        gameName: 'Treasure Hunt',
        reels: 5,
        rows: 3,
        rtp: 96.8,
        volatility: 'high',
        features: ['free_spins', 'collector', 'multipliers'],
        theme: 'ancient',
        bonus: { trigger: 'scatter', spins: 15, retrigger: true },
      })
    );

    // Game 9: Mega Wins
    games.push(
      this.generateGame({
        gameName: 'Mega Wins',
        reels: 6,
        rows: 4,
        rtp: 97.0,
        volatility: 'high',
        features: ['free_spins', 'megaways', 'cascading_reels'],
        theme: 'space',
        bonus: { trigger: 'scatter', spins: 20, retrigger: true },
      })
    );

    // Game 10: Lucky Sevens
    games.push(
      this.generateGame({
        gameName: 'Lucky Sevens',
        reels: 3,
        rows: 1,
        rtp: 93.0,
        volatility: 'low',
        features: ['free_spins'],
        theme: 'neon',
        bonus: { trigger: 'scatter', spins: 3, retrigger: false },
      })
    );

    return games;
  }

  /**
   * Generate game from JSON config
   */
  static generateFromJSON(jsonConfig: string): SlotGameEngine {
    const config = JSON.parse(jsonConfig) as SlotGameGeneratorConfig;
    return this.generateGame(config);
  }

  /**
   * Export game config to JSON
   */
  static exportGameConfig(game: SlotGameEngine): string {
    const config = game.getConfig();
    return JSON.stringify(config, null, 2);
  }
}

export default SlotGameGenerator;
