import type { GameLifecycle, TransactionType, WinClassId } from "./constants"; export type Volatility = "low" | "medium" | "high" | "extreme"; export interface PublicUser { id: string; username: string; level: number; xp: number; xpIntoLevel: number; xpForNext: number; createdAt: string; lastLoginAt: string | null; isNew?: boolean; } export interface WalletView { balance: number; lifetimeWagered: number; lifetimeWon: number; updatedAt: string; } export interface UserSettings { soundEnabled: boolean; musicVolume: number; effectsVolume: number; masterVolume: number; reduceMotion: boolean; animationIntensity: "low" | "medium" | "high"; sessionReminderMinutes: number; breakReminder: boolean; leaderboardOptIn: boolean; } export interface GameCard { slug: string; name: string; tagline: string; theme: string; volatility: Volatility; version: string; grid: { reels: number; rows: number }; minBet: number; maxBet: number; maxMultiplier: number; features: string[]; tags: string[]; palette: { primary: string; secondary: string; glow: string; bg: string; surface?: string }; /** Renderer presentation hints (frame, backdrop, particles, ambience). */ presentation?: { frame: string; backdrop: string; particles: string; ambience: string }; lifecycle: GameLifecycle; kind: "slot" | "crash" | "arcade"; category: "slots" | "risk" | "originals"; isNew: boolean; isFeatured: boolean; isJackpot: boolean; popularity: number; favorite?: boolean; lastPlayedAt?: string | null; } export interface GameInfo extends GameCard { rtp: number; hitFrequency: number | null; description: string; rules: string[]; paytable: { symbol: string; label: string; pays: Record }[]; certification: CertificationSummary | null; } export interface CertificationSummary { spins: number; configuredRtp: number; observedRtp: number; deviation: number; hitRate: number; bonusRate: number; maxWinMultiplier: number; status: "PASS" | "FAIL"; certifiedAt: string; version: string; } export interface SpinResponse { roundId: string; game: string; version: string; bet: number; win: number; multiplier: number; winClass: WinClassId; balance: number; xp: { gained: number; total: number; level: number; leveledUp: boolean; levelReward: number }; result: unknown; unlocked: { achievements: string[]; missions: string[] }; replayed?: boolean; } export interface LedgerEntry { id: string; type: TransactionType; amount: number; balanceAfter: number; reference: string | null; createdAt: string; } export interface RoundHistoryEntry { roundId: string; game: string; gameName: string; bet: number; win: number; multiplier: number; balanceAfter: number; createdAt: string; } export interface DailyRewardStatus { available: boolean; streakDay: number; nextAmount: number; nextAvailableAt: string | null; schedule: readonly number[]; claimedToday: boolean; } export interface RescueStatus { eligible: boolean; amount: number; balance: number; nextAvailableAt: string | null; } export interface AchievementView { key: string; name: string; description: string; rewardCredits: number; rewardXp: number; icon: string; unlockedAt: string | null; progress: number; target: number; } export interface MissionView { key: string; name: string; description: string; period: "daily" | "weekly"; target: number; progress: number; rewardCredits: number; rewardXp: number; completedAt: string | null; claimedAt: string | null; expiresAt: string; } export interface LeaderboardEntry { rank: number; username: string; level: number; value: number; game?: string | null; isYou?: boolean; } export interface LeaderboardView { category: string; label: string; entries: LeaderboardEntry[]; you: LeaderboardEntry | null; updatedAt: string; } export interface ApiError { error: string; message: string; details?: unknown; }