/**
 * Slot Game Engine - Type Definitions
 * Defines all types and interfaces for the slot game system
 */

export type ReelType = 'standard' | 'dynamic' | 'expanding' | 'sticky';
export type SymbolType = 'regular' | 'wild' | 'scatter' | 'bonus' | 'multiplier' | 'collector';
export type GameType = 'classic' | 'video' | 'megaways' | 'hold_spin' | 'bonus_feature' | 'progressive';
export type Volatility = 'low' | 'medium' | 'high' | 'extreme';
export type BonusType = 'free_spins' | 'collector' | 'respin' | 'pick_bonus' | 'wheel_spin';

export interface Symbol {
  id: string;
  name: string;
  type: SymbolType;
  value: number;
  multiplier?: number;
  wildSubstitutes?: string[];
  animationId?: string;
}

export interface Reel {
  id: string;
  symbols: Symbol[];
  type: ReelType;
  minHeight?: number;
  maxHeight?: number;
}

export interface Payline {
  id: string;
  positions: number[]; // Position in each reel
  multiplier: number;
}

export interface WaysToWin {
  enabled: boolean;
  ways: number; // e.g., 243, 1024
  adjacentOnly: boolean;
}

export interface GameConfig {
  id: string;
  name: string;
  type: GameType;
  reels: number;
  rows: number;
  rtp: number; // 85-98
  volatility: Volatility;
  minBet: number;
  maxBet: number;
  paylines?: Payline[];
  waysToWin?: WaysToWin;
  cascadingReels?: boolean;
  clusterPays?: boolean;
  symbols: Symbol[];
  reelConfig: Reel[];
  features: BonusType[];
  bonusConfig?: BonusConfig;
  theme: string;
  createdAt: Date;
  updatedAt: Date;
  enabled: boolean;
}

export interface BonusConfig {
  freeSpins?: {
    triggerSymbol: string;
    triggerCount: number;
    baseSpins: number;
    retrigger: boolean;
    multiplier?: number;
  };
  collector?: {
    triggerSymbol: string;
    collectSymbols: string[];
    bonusPerSymbol: number;
  };
  respin?: {
    triggerSymbol: string;
    lockSymbols: string[];
    maxRespins: number;
  };
  pickBonus?: {
    triggerSymbol: string;
    pickCount: number;
    prizes: number[];
  };
}

export interface SpinRequest {
  userId: string;
  gameId: string;
  betAmount: number;
  freeSpinMode?: boolean;
}

export interface SpinResult {
  reels: Symbol[][];
  winAmount: number;
  newBalance: number;
  winLines: WinLine[];
  bonusTriggered?: BonusTriggered;
  cascadeCount?: number;
  totalMultiplier: number;
  rtp: number;
}

export interface WinLine {
  paylineId: string;
  symbols: Symbol[];
  multiplier: number;
  winAmount: number;
}

export interface BonusTriggered {
  type: BonusType;
  data: Record<string, any>;
}

export interface GameSession {
  id: string;
  userId: string;
  gameId: string;
  startBalance: number;
  currentBalance: number;
  totalWagered: number;
  totalWon: number;
  spinCount: number;
  bonusSpinsRemaining?: number;
  startedAt: Date;
  lastSpinAt: Date;
  endedAt?: Date;
}

export interface GameAnalytics {
  gameId: string;
  totalSpins: number;
  totalWagered: number;
  totalPaid: number;
  actualRtp: number;
  averageBet: number;
  biggestWin: number;
  bonusTriggersCount: number;
  cascadeTriggersCount: number;
  playerCount: number;
  sessionDuration: number; // average in seconds
}
