import { mysqlTable, mysqlSchema, AnyMySqlColumn, int, varchar, text, mysqlEnum, timestamp, index, json, decimal, bigint, float } from "drizzle-orm/mysql-core"
import { sql } from "drizzle-orm"

export const achievements = mysqlTable("achievements", {
	id: int().autoincrement().notNull(),
	name: varchar({ length: 128 }).notNull(),
	description: text(),
	icon: text(),
	category: mysqlEnum(['gameplay','social','spending','milestone','special']).notNull(),
	condition: text().notNull(),
	rewardSc: int().default(0).notNull(),
	rewardGc: int().default(0).notNull(),
	isActive: tinyint().default(1).notNull(),
	createdAt: timestamp({ mode: 'string' }).default('CURRENT_TIMESTAMP').notNull(),
});

export const aiEmployeeChats = mysqlTable("ai_employee_chats", {
	id: int().autoincrement().notNull(),
	employeeId: int().notNull(),
	userMessage: text().notNull(),
	assistantMessage: text().notNull(),
	createdAt: timestamp({ mode: 'string' }).default('CURRENT_TIMESTAMP'),
});

export const aiEmployeeTasks = mysqlTable("ai_employee_tasks", {
	id: int().autoincrement().notNull(),
	title: varchar({ length: 255 }).notNull(),
	description: text().notNull(),
	assignedTo: int().notNull(),
	priority: mysqlEnum(['low','medium','high','urgent']).default('medium'),
	status: mysqlEnum(['pending','in_progress','completed','cancelled']).default('pending'),
	dueDate: varchar({ length: 50 }),
	createdAt: timestamp({ mode: 'string' }).default('CURRENT_TIMESTAMP'),
	updatedAt: timestamp({ mode: 'string' }).defaultNow().onUpdateNow(),
});

export const aiEmployees = mysqlTable("ai_employees", {
	id: int().autoincrement().notNull(),
	name: varchar({ length: 100 }).notNull(),
	role: varchar({ length: 100 }).notNull(),
	department: varchar({ length: 100 }).notNull(),
	systemPrompt: text(),
	avatarUrl: text(),
	isActive: tinyint().default(1),
	tasksCompleted: int().default(0),
	totalChats: int().default(0),
	createdAt: timestamp({ mode: 'string' }).default('CURRENT_TIMESTAMP'),
	updatedAt: timestamp({ mode: 'string' }).defaultNow().onUpdateNow(),
});

export const aiGeneratedGames = mysqlTable("ai_generated_games", {
	id: int().autoincrement().notNull(),
	originalGameId: int(),
	originalGameUrl: text(),
	gameName: varchar({ length: 255 }).notNull(),
	gameSlug: varchar({ length: 255 }).notNull(),
	description: text(),
	aiAnalysis: json(),
	reelSymbols: json(),
	bonusFeatures: json(),
	thumbnailUrl: text(),
	reelGraphicsUrl: json(),
	symbolGraphicsUrl: json(),
	rtp: decimal({ precision: 5, scale: 2 }).default('96').notNull(),
	volatility: mysqlEnum(['low','medium','high']).default('medium').notNull(),
	isActive: tinyint().default(1).notNull(),
	createdAt: timestamp({ mode: 'string' }).default('CURRENT_TIMESTAMP').notNull(),
	updatedAt: timestamp({ mode: 'string' }).defaultNow().onUpdateNow().notNull(),
},
(table) => [
	index("ai_generated_games_gameSlug_unique").on(table.gameSlug),
	index("idx_ai_games_slug").on(table.gameSlug),
]);

export const aiSocialContent = mysqlTable("ai_social_content", {
	id: int().autoincrement().notNull(),
	createdBy: int().notNull(),
	platform: mysqlEnum(['facebook','instagram','twitter','tiktok']).notNull(),
	prompt: text().notNull(),
	imageUrl: text().notNull(),
	caption: text(),
	hashtags: text(),
	isPublished: tinyint().default(0).notNull(),
	publishedAt: timestamp({ mode: 'string' }),
	impressions: int().default(0).notNull(),
	clicks: int().default(0).notNull(),
	createdAt: timestamp({ mode: 'string' }).default('CURRENT_TIMESTAMP').notNull(),
},
(table) => [
	index("idx_social_content_platform").on(table.platform),
]);

export const auditLogs = mysqlTable("audit_logs", {
	id: bigint({ mode: "number" }).autoincrement().notNull(),
	actorId: int(),
	actorRole: varchar({ length: 32 }),
	targetUserId: int(),
	action: varchar({ length: 128 }).notNull(),
	category: mysqlEnum(['auth','wallet','game','admin','kyc','staff','system','fraud']).notNull(),
	details: json(),
	ipAddress: varchar({ length: 64 }),
	userAgent: text(),
	createdAt: timestamp({ mode: 'string' }).default('CURRENT_TIMESTAMP').notNull(),
},
(table) => [
	index("idx_audit_actorId").on(table.actorId),
	index("idx_audit_createdAt").on(table.createdAt),
	index("idx_audit_category").on(table.category),
]);

export const bingoCards = mysqlTable("bingo_cards", {
	id: bigint({ mode: "number" }).autoincrement().notNull(),
	sessionId: int().notNull(),
	userId: int().notNull(),
	roomId: int().notNull(),
	numbers: json().notNull(),
	daubed: json().notNull(),
	hasBingo: tinyint().default(0).notNull(),
	winAmount: decimal({ precision: 18, scale: 2 }).default('0.00'),
	purchasedAt: timestamp({ mode: 'string' }).default('CURRENT_TIMESTAMP').notNull(),
},
(table) => [
	index("idx_cards_sessionId").on(table.sessionId),
	index("idx_cards_userId").on(table.userId),
]);

export const bingoRooms = mysqlTable("bingo_rooms", {
	id: int().autoincrement().notNull(),
	name: varchar({ length: 128 }).notNull(),
	currency: mysqlEnum(['GC','SC']).notNull(),
	ticketPrice: decimal({ precision: 10, scale: 2 }).notNull(),
	maxCards: int().default(4).notNull(),
	jackpot: decimal({ precision: 18, scale: 2 }).default('0.00').notNull(),
	jackpotBallLimit: int().default(76).notNull(),
	status: mysqlEnum(['open','calling','finished','paused']).default('open').notNull(),
	currentSession: int(),
	createdAt: timestamp({ mode: 'string' }).default('CURRENT_TIMESTAMP').notNull(),
});

export const bingoSessions = mysqlTable("bingo_sessions", {
	id: int().autoincrement().notNull(),
	roomId: int().notNull(),
	calledBalls: json().notNull(),
	ballCount: int().default(0).notNull(),
	prizePool: decimal({ precision: 18, scale: 2 }).default('0.00').notNull(),
	jackpotWon: tinyint().default(0).notNull(),
	winners: json(),
	status: mysqlEnum(['active','finished']).default('active').notNull(),
	startedAt: timestamp({ mode: 'string' }).default('CURRENT_TIMESTAMP').notNull(),
	finishedAt: timestamp({ mode: 'string' }),
});

export const casinoGames = mysqlTable("casino_games", {
	id: int().autoincrement().notNull(),
	slug: varchar({ length: 128 }).notNull(),
	title: varchar({ length: 255 }).notNull(),
	provider: varchar({ length: 128 }).notNull(),
	category: mysqlEnum(['slots','table','live','jackpot','new','popular','crash','instant']).notNull(),
	tags: json(),
	thumbnailUrl: text(),
	bannerUrl: text(),
	rtp: float().default(96).notNull(),
	volatility: mysqlEnum(['low','medium','high','very_high']).default('medium').notNull(),
	minBetGc: decimal({ precision: 10, scale: 2 }).default('1.00').notNull(),
	maxBetGc: decimal({ precision: 10, scale: 2 }).default('1000.00').notNull(),
	minBetSc: decimal({ precision: 10, scale: 2 }).default('0.10').notNull(),
	maxBetSc: decimal({ precision: 10, scale: 2 }).default('100.00').notNull(),
	isActive: tinyint().default(1).notNull(),
	isFeatured: tinyint().default(0).notNull(),
	isNew: tinyint().default(0).notNull(),
	playCount: bigint({ mode: "number" }).notNull(),
	description: text(),
	features: json(),
	paylines: int(),
	reels: int(),
	createdAt: timestamp({ mode: 'string' }).default('CURRENT_TIMESTAMP').notNull(),
},
(table) => [
	index("casino_games_slug_unique").on(table.slug),
	index("idx_games_provider").on(table.provider),
	index("idx_games_category").on(table.category),
]);

export const chatMessages = mysqlTable("chat_messages", {
	id: bigint({ mode: "number" }).autoincrement().notNull(),
	userId: int().notNull(),
	channel: varchar({ length: 64 }).default('global').notNull(),
	message: text().notNull(),
	isDeleted: tinyint().default(0).notNull(),
	createdAt: timestamp({ mode: 'string' }).default('CURRENT_TIMESTAMP').notNull(),
},
(table) => [
	index("idx_chat_channel").on(table.channel),
]);

export const coinPackages = mysqlTable("coin_packages", {
	id: int().autoincrement().notNull(),
	name: varchar({ length: 128 }).notNull(),
	gcAmount: decimal({ precision: 18, scale: 2 }).notNull(),
	scBonusAmount: decimal({ precision: 18, scale: 2 }).default('0.00').notNull(),
	priceUsd: decimal({ precision: 10, scale: 2 }).notNull(),
	isPopular: tinyint().default(0).notNull(),
	isBestValue: tinyint().default(0).notNull(),
	isActive: tinyint().default(1).notNull(),
	sortOrder: int().default(0).notNull(),
	createdAt: timestamp({ mode: 'string' }).default('CURRENT_TIMESTAMP').notNull(),
});

export const dailyBonuses = mysqlTable("daily_bonuses", {
	id: int().autoincrement().notNull(),
	userId: int().notNull(),
	gcAmount: decimal({ precision: 10, scale: 2 }).notNull(),
	scAmount: decimal({ precision: 10, scale: 2 }).notNull(),
	spinResult: int().notNull(),
	claimedAt: timestamp({ mode: 'string' }).default('CURRENT_TIMESTAMP').notNull(),
},
(table) => [
	index("idx_daily_userId").on(table.userId),
]);

export const dailySpins = mysqlTable("daily_spins", {
	id: int().autoincrement().notNull(),
	userId: int().notNull(),
	spinsUsed: int().default(0).notNull(),
	lastSpinAt: timestamp({ mode: 'string' }),
	lastResetAt: timestamp({ mode: 'string' }).default('CURRENT_TIMESTAMP').notNull(),
	totalWon: decimal({ precision: 10, scale: 2 }).default('0.00').notNull(),
	createdAt: timestamp({ mode: 'string' }).default('CURRENT_TIMESTAMP').notNull(),
	updatedAt: timestamp({ mode: 'string' }).defaultNow().onUpdateNow().notNull(),
},
(table) => [
	index("idx_daily_spins_userId").on(table.userId),
	index("idx_daily_spins_lastResetAt").on(table.lastResetAt),
]);

export const eventParticipation = mysqlTable("event_participation", {
	id: int().autoincrement().notNull(),
	eventId: int().notNull(),
	userId: int().notNull(),
	score: decimal({ precision: 15, scale: 2 }).default('0.00'),
	rewardClaimed: tinyint().default(0).notNull(),
	claimedAt: timestamp({ mode: 'string' }),
	joinedAt: timestamp({ mode: 'string' }).default('CURRENT_TIMESTAMP').notNull(),
},
(table) => [
	index("idx_event_participation_eventId").on(table.eventId),
	index("idx_event_participation_userId").on(table.userId),
]);

export const fraudAlerts = mysqlTable("fraud_alerts", {
	id: int().autoincrement().notNull(),
	userId: int().notNull(),
	alertType: mysqlEnum(['abnormal_rtp','rapid_betting','multi_account','bonus_abuse','unusual_withdrawal','velocity','pattern']).notNull(),
	severity: mysqlEnum(['low','medium','high','critical']).default('medium').notNull(),
	description: text().notNull(),
	details: json(),
	status: mysqlEnum(['open','investigating','resolved','dismissed']).default('open').notNull(),
	resolvedBy: int(),
	resolvedAt: timestamp({ mode: 'string' }),
	createdAt: timestamp({ mode: 'string' }).default('CURRENT_TIMESTAMP').notNull(),
},
(table) => [
	index("idx_fraud_userId").on(table.userId),
	index("idx_fraud_status").on(table.status),
]);

export const friends = mysqlTable("friends", {
	id: int().autoincrement().notNull(),
	userId: int().notNull(),
	friendId: int().notNull(),
	status: mysqlEnum(['pending','accepted','blocked']).default('pending').notNull(),
	requestedAt: timestamp({ mode: 'string' }).default('CURRENT_TIMESTAMP').notNull(),
	acceptedAt: timestamp({ mode: 'string' }),
},
(table) => [
	index("idx_friends_unique").on(table.userId, table.friendId),
	index("idx_friends_userId").on(table.userId),
	index("idx_friends_friendId").on(table.friendId),
]);

export const gameAnalytics = mysqlTable("game_analytics", {
	id: int().autoincrement().notNull(),
	gameId: int().notNull(),
	totalSpins: int().default(0).notNull(),
	totalWagered: decimal({ precision: 15, scale: 2 }).default('0').notNull(),
	totalWon: decimal({ precision: 15, scale: 2 }).default('0').notNull(),
	totalRevenue: decimal({ precision: 15, scale: 2 }).default('0').notNull(),
	uniquePlayers: int().default(0).notNull(),
	avgBetSize: decimal({ precision: 10, scale: 2 }).default('0').notNull(),
	rtp: decimal({ precision: 5, scale: 2 }).default('96').notNull(),
	lastUpdated: timestamp({ mode: 'string' }).defaultNow().onUpdateNow().notNull(),
	createdAt: timestamp({ mode: 'string' }).default('CURRENT_TIMESTAMP').notNull(),
},
(table) => [
	index("idx_game_analytics_gameId").on(table.gameId),
]);

export const gameChat = mysqlTable("game_chat", {
	id: int().autoincrement().notNull(),
	gameId: int(),
	userId: int().notNull(),
	message: text().notNull(),
	isPublic: tinyint().default(1).notNull(),
	recipientId: int(),
	isPinned: tinyint().default(0).notNull(),
	isModerated: tinyint().default(0).notNull(),
	createdAt: timestamp({ mode: 'string' }).default('CURRENT_TIMESTAMP').notNull(),
},
(table) => [
	index("idx_game_chat_gameId").on(table.gameId),
	index("idx_game_chat_userId").on(table.userId),
	index("idx_game_chat_createdAt").on(table.createdAt),
]);

export const gameSessions = mysqlTable("game_sessions", {
	id: bigint({ mode: "number" }).autoincrement().notNull(),
	userId: int().notNull(),
	gameId: int().notNull(),
	currency: mysqlEnum(['GC','SC']).notNull(),
	betAmount: decimal({ precision: 18, scale: 2 }).notNull(),
	winAmount: decimal({ precision: 18, scale: 2 }).default('0.00').notNull(),
	multiplier: float().notNull(),
	outcome: json(),
	rtpApplied: float(),
	createdAt: timestamp({ mode: 'string' }).default('CURRENT_TIMESTAMP').notNull(),
},
(table) => [
	index("idx_sessions_userId").on(table.userId),
	index("idx_sessions_gameId").on(table.gameId),
]);

export const jackpotHistory = mysqlTable("jackpot_history", {
	id: int().autoincrement().notNull(),
	jackpotId: int("jackpot_id").notNull(),
	userId: int("user_id").notNull(),
	gameId: int("game_id").notNull(),
	winAmount: decimal("win_amount", { precision: 18, scale: 2 }).notNull(),
	spinId: varchar("spin_id", { length: 64 }),
	createdAt: timestamp("created_at", { mode: 'string' }).default('CURRENT_TIMESTAMP').notNull(),
},
(table) => [
	index("idx_jackpot_history_jackpotId").on(table.jackpotId),
	index("idx_jackpot_history_userId").on(table.userId),
	index("idx_jackpot_history_createdAt").on(table.createdAt),
]);

export const kycDocuments = mysqlTable("kyc_documents", {
	id: int().autoincrement().notNull(),
	userId: int().notNull(),
	docType: mysqlEnum(['passport','drivers_license','national_id','utility_bill','bank_statement','selfie']).notNull(),
	fileUrl: text().notNull(),
	fileKey: text().notNull(),
	status: mysqlEnum(['pending','approved','rejected']).default('pending').notNull(),
	reviewedBy: int(),
	reviewNote: text(),
	submittedAt: timestamp({ mode: 'string' }).default('CURRENT_TIMESTAMP').notNull(),
	reviewedAt: timestamp({ mode: 'string' }),
});

export const leaderboards = mysqlTable("leaderboards", {
	id: int().autoincrement().notNull(),
	userId: int().notNull(),
	leaderboardType: mysqlEnum(['global','weekly','daily','game_specific']).notNull(),
	gameId: int(),
	totalWinnings: decimal({ precision: 15, scale: 2 }).default('0.00').notNull(),
	totalBets: decimal({ precision: 15, scale: 2 }).default('0.00').notNull(),
	winCount: int().default(0).notNull(),
	rank: int().default(0).notNull(),
	period: varchar({ length: 20 }),
	updatedAt: timestamp({ mode: 'string' }).defaultNow().onUpdateNow().notNull(),
	createdAt: timestamp({ mode: 'string' }).default('CURRENT_TIMESTAMP').notNull(),
},
(table) => [
	index("idx_leaderboard_type").on(table.leaderboardType),
	index("idx_leaderboard_userId").on(table.userId),
	index("idx_leaderboard_gameId").on(table.gameId),
]);

export const miniGameRounds = mysqlTable("mini_game_rounds", {
	id: bigint({ mode: "number" }).autoincrement().notNull(),
	userId: int().notNull(),
	gameType: mysqlEnum(['plinko','mines','dice','crash','wheel']).notNull(),
	currency: mysqlEnum(['GC','SC']).notNull(),
	betAmount: decimal({ precision: 18, scale: 2 }).notNull(),
	winAmount: decimal({ precision: 18, scale: 2 }).default('0.00').notNull(),
	multiplier: float().notNull(),
	serverSeed: varchar({ length: 128 }).notNull(),
	clientSeed: varchar({ length: 128 }),
	nonce: int().default(0).notNull(),
	outcome: json().notNull(),
	isVerified: tinyint().default(0).notNull(),
	createdAt: timestamp({ mode: 'string' }).default('CURRENT_TIMESTAMP').notNull(),
},
(table) => [
	index("idx_minigame_userId").on(table.userId),
]);

export const multiplierBoosts = mysqlTable("multiplier_boosts", {
	id: int().autoincrement().notNull(),
	userId: int().notNull(),
	multiplier: decimal({ precision: 3, scale: 2 }).notNull(),
	reason: mysqlEnum(['event','achievement','vip_tier','promotional','referral']).notNull(),
	startAt: timestamp({ mode: 'string' }).notNull(),
	endAt: timestamp({ mode: 'string' }).notNull(),
	isActive: tinyint().default(1).notNull(),
	appliedGames: json(),
	createdAt: timestamp({ mode: 'string' }).default('CURRENT_TIMESTAMP').notNull(),
},
(table) => [
	index("idx_multiplier_userId").on(table.userId),
	index("idx_multiplier_isActive").on(table.isActive),
	index("idx_multiplier_endAt").on(table.endAt),
]);

export const notificationPreferences = mysqlTable("notification_preferences", {
	id: int().autoincrement().notNull(),
	userId: int().notNull(),
	emailNotifications: tinyint().default(1).notNull(),
	pushNotifications: tinyint().default(1).notNull(),
	inAppNotifications: tinyint().default(1).notNull(),
	paymentNotifications: tinyint().default(1).notNull(),
	gameNotifications: tinyint().default(1).notNull(),
	promotionalNotifications: tinyint().default(0).notNull(),
	systemAlerts: tinyint().default(1).notNull(),
	emailFrequency: mysqlEnum(['instant','daily','weekly','never']).default('instant').notNull(),
	createdAt: timestamp({ mode: 'string' }).default('CURRENT_TIMESTAMP').notNull(),
	updatedAt: timestamp({ mode: 'string' }).defaultNow().onUpdateNow().notNull(),
},
(table) => [
	index("notification_preferences_userId_unique").on(table.userId),
	index("idx_notif_prefs_userId").on(table.userId),
]);

export const notifications = mysqlTable("notifications", {
	id: int().autoincrement().notNull(),
	userId: int().notNull(),
	type: mysqlEnum(['payment_success','payment_failed','bonus_credited','game_win','game_loss','bet_placed','bet_settled','odds_changed','poker_table_joined','poker_hand_result','poker_tournament_update','bingo_card_purchased','bingo_number_called','bingo_win','kyc_approved','kyc_rejected','kyc_pending','account_suspended','account_restored','withdrawal_approved','withdrawal_rejected','system_alert','promotional','admin_broadcast']).notNull(),
	title: varchar({ length: 255 }).notNull(),
	message: text().notNull(),
	channels: json(),
	data: json(),
	isRead: tinyint().default(0).notNull(),
	readAt: timestamp({ mode: 'string' }),
	emailSent: tinyint().default(0).notNull(),
	pushSent: tinyint().default(0).notNull(),
	createdAt: timestamp({ mode: 'string' }).default('CURRENT_TIMESTAMP').notNull(),
	expiresAt: timestamp({ mode: 'string' }),
},
(table) => [
	index("idx_notifications_userId").on(table.userId),
	index("idx_notifications_createdAt").on(table.createdAt),
]);

export const paymentMethods = mysqlTable("payment_methods", {
	id: int().autoincrement().notNull(),
	name: varchar({ length: 100 }).notNull(),
	provider: varchar({ length: 100 }).notNull(),
	type: mysqlEnum(['purchase','redemption']).notNull(),
	feePercent: decimal({ precision: 5, scale: 2 }).default('0'),
	flatFee: decimal({ precision: 10, scale: 2 }).default('0'),
	minAmount: decimal({ precision: 10, scale: 2 }).default('0'),
	maxAmount: decimal({ precision: 10, scale: 2 }).default('10000'),
	isEnabled: tinyint().default(1),
	iconUrl: text(),
	description: text(),
	sortOrder: int().default(0),
	createdAt: timestamp({ mode: 'string' }).default('CURRENT_TIMESTAMP'),
	updatedAt: timestamp({ mode: 'string' }).defaultNow().onUpdateNow(),
});

export const platformSettings = mysqlTable("platform_settings", {
	id: int().autoincrement().notNull(),
	settingKey: varchar("setting_key", { length: 100 }).notNull(),
	settingValue: text("setting_value").notNull(),
	description: text(),
	updatedAt: timestamp("updated_at", { mode: 'string' }).defaultNow().onUpdateNow(),
	updatedBy: varchar("updated_by", { length: 255 }),
},
(table) => [
	index("setting_key").on(table.settingKey),
]);

export const playerProfiles = mysqlTable("player_profiles", {
	id: int().autoincrement().notNull(),
	userId: int().notNull(),
	bio: text(),
	avatarUrl: text(),
	bannerUrl: text(),
	totalSpins: int().default(0).notNull(),
	totalWins: decimal({ precision: 15, scale: 2 }).default('0').notNull(),
	favoriteGame: varchar({ length: 128 }),
	level: int().default(1).notNull(),
	experience: int().default(0).notNull(),
	isPublic: tinyint().default(1).notNull(),
	facebookId: varchar({ length: 255 }),
	instagramHandle: varchar({ length: 255 }),
	twitterHandle: varchar({ length: 255 }),
	createdAt: timestamp({ mode: 'string' }).default('CURRENT_TIMESTAMP').notNull(),
	updatedAt: timestamp({ mode: 'string' }).defaultNow().onUpdateNow().notNull(),
},
(table) => [
	index("player_profiles_userId_unique").on(table.userId),
	index("idx_player_profiles_userId").on(table.userId),
]);

export const pokerHands = mysqlTable("poker_hands", {
	id: bigint({ mode: "number" }).autoincrement().notNull(),
	tableId: int().notNull(),
	handNumber: int().notNull(),
	players: json().notNull(),
	communityCards: json(),
	pot: decimal({ precision: 18, scale: 2 }).notNull(),
	winners: json(),
	actions: json(),
	createdAt: timestamp({ mode: 'string' }).default('CURRENT_TIMESTAMP').notNull(),
},
(table) => [
	index("idx_hands_tableId").on(table.tableId),
]);

export const pokerTables = mysqlTable("poker_tables", {
	id: int().autoincrement().notNull(),
	name: varchar({ length: 128 }).notNull(),
	gameType: mysqlEnum(['holdem','omaha']).default('holdem').notNull(),
	currency: mysqlEnum(['GC','SC']).notNull(),
	smallBlind: decimal({ precision: 10, scale: 2 }).notNull(),
	bigBlind: decimal({ precision: 10, scale: 2 }).notNull(),
	minBuyIn: decimal({ precision: 10, scale: 2 }).notNull(),
	maxBuyIn: decimal({ precision: 10, scale: 2 }).notNull(),
	maxPlayers: int().default(9).notNull(),
	currentPlayers: int().default(0).notNull(),
	status: mysqlEnum(['waiting','active','paused','closed']).default('waiting').notNull(),
	tournamentId: int(),
	createdAt: timestamp({ mode: 'string' }).default('CURRENT_TIMESTAMP').notNull(),
});

export const pokerTournaments = mysqlTable("poker_tournaments", {
	id: int().autoincrement().notNull(),
	name: varchar({ length: 255 }).notNull(),
	currency: mysqlEnum(['GC','SC']).notNull(),
	buyIn: decimal({ precision: 10, scale: 2 }).notNull(),
	prizePool: decimal({ precision: 18, scale: 2 }).default('0.00').notNull(),
	maxPlayers: int().notNull(),
	registeredPlayers: int().default(0).notNull(),
	startTime: timestamp({ mode: 'string' }).notNull(),
	status: mysqlEnum(['registering','running','finished','cancelled']).default('registering').notNull(),
	structure: json(),
	payoutStructure: json(),
	createdAt: timestamp({ mode: 'string' }).default('CURRENT_TIMESTAMP').notNull(),
});

export const poolSharkAchievements = mysqlTable("pool_shark_achievements", {
	id: int().autoincrement().notNull(),
	userId: int().notNull(),
	achievementType: mysqlEnum(['first_win','five_wins','ten_wins','fifty_wins','hundred_wins','pool_shark','hustler','legend','perfect_break','high_accuracy','winning_streak','prize_master']).notNull(),
	title: varchar({ length: 100 }).notNull(),
	description: text(),
	badgeUrl: text(),
	unlockedAt: timestamp({ mode: 'string' }).default('CURRENT_TIMESTAMP').notNull(),
	createdAt: timestamp({ mode: 'string' }).default('CURRENT_TIMESTAMP').notNull(),
},
(table) => [
	index("idx_pool_shark_achievements_unique").on(table.userId, table.achievementType),
	index("idx_pool_shark_achievements_userId").on(table.userId),
	index("idx_pool_shark_achievements_type").on(table.achievementType),
]);

export const poolSharkLeaderboards = mysqlTable("pool_shark_leaderboards", {
	id: int().autoincrement().notNull(),
	userId: int().notNull(),
	totalMatches: int().default(0).notNull(),
	totalWins: int().default(0).notNull(),
	totalLosses: int().default(0).notNull(),
	winRate: decimal({ precision: 5, scale: 2 }).default('0.00').notNull(),
	totalPrizeWon: decimal({ precision: 15, scale: 2 }).default('0.00').notNull(),
	highestBreak: int().default(0).notNull(),
	averageAccuracy: decimal({ precision: 5, scale: 2 }).default('0.00').notNull(),
	totalBallsPocketed: int().default(0).notNull(),
	rank: int().default(0).notNull(),
	lastUpdated: timestamp({ mode: 'string' }).defaultNow().onUpdateNow().notNull(),
	createdAt: timestamp({ mode: 'string' }).default('CURRENT_TIMESTAMP').notNull(),
},
(table) => [
	index("pool_shark_leaderboards_userId_unique").on(table.userId),
	index("idx_pool_shark_leaderboards_userId").on(table.userId),
	index("idx_pool_shark_leaderboards_rank").on(table.rank),
	index("idx_pool_shark_leaderboards_totalWins").on(table.totalWins),
]);

export const poolSharkMatches = mysqlTable("pool_shark_matches", {
	id: int().autoincrement().notNull(),
	tableId: int().notNull(),
	status: mysqlEnum(['waiting','in_progress','completed','cancelled']).default('waiting').notNull(),
	winnerId: int(),
	winnerBreak: int(),
	totalPrizePool: decimal({ precision: 10, scale: 2 }).notNull(),
	startedAt: timestamp({ mode: 'string' }),
	completedAt: timestamp({ mode: 'string' }),
	createdAt: timestamp({ mode: 'string' }).default('CURRENT_TIMESTAMP').notNull(),
	updatedAt: timestamp({ mode: 'string' }).defaultNow().onUpdateNow().notNull(),
},
(table) => [
	index("idx_pool_shark_matches_tableId").on(table.tableId),
	index("idx_pool_shark_matches_status").on(table.status),
	index("idx_pool_shark_matches_winnerId").on(table.winnerId),
	index("idx_pool_shark_matches_createdAt").on(table.createdAt),
]);

export const poolSharkParticipants = mysqlTable("pool_shark_participants", {
	id: int().autoincrement().notNull(),
	matchId: int().notNull(),
	userId: int().notNull(),
	entryFee: decimal({ precision: 10, scale: 2 }).notNull(),
	position: int(),
	prizeWon: decimal({ precision: 10, scale: 2 }).default('0.00').notNull(),
	ballsPocketed: int().default(0).notNull(),
	highestBreak: int().default(0).notNull(),
	shotsAttempted: int().default(0).notNull(),
	shotsMade: int().default(0).notNull(),
	accuracy: decimal({ precision: 5, scale: 2 }).default('0.00').notNull(),
	joinedAt: timestamp({ mode: 'string' }).default('CURRENT_TIMESTAMP').notNull(),
	leftAt: timestamp({ mode: 'string' }),
	createdAt: timestamp({ mode: 'string' }).default('CURRENT_TIMESTAMP').notNull(),
},
(table) => [
	index("idx_pool_shark_participants_unique").on(table.matchId, table.userId),
	index("idx_pool_shark_participants_matchId").on(table.matchId),
	index("idx_pool_shark_participants_userId").on(table.userId),
]);

export const poolSharkTables = mysqlTable("pool_shark_tables", {
	id: int().autoincrement().notNull(),
	name: varchar({ length: 100 }).notNull(),
	description: text(),
	entryFee: decimal({ precision: 10, scale: 2 }).notNull(),
	maxPlayers: int().default(2).notNull(),
	minPlayers: int().default(2).notNull(),
	prizeMultiplier: decimal({ precision: 5, scale: 2 }).default('2.00').notNull(),
	status: mysqlEnum(['active','inactive','archived']).default('active').notNull(),
	sortOrder: int().default(0).notNull(),
	createdAt: timestamp({ mode: 'string' }).default('CURRENT_TIMESTAMP').notNull(),
	updatedAt: timestamp({ mode: 'string' }).defaultNow().onUpdateNow().notNull(),
},
(table) => [
	index("idx_pool_shark_tables_status").on(table.status),
	index("idx_pool_shark_tables_sortOrder").on(table.sortOrder),
]);

export const poolSharkWaitingLists = mysqlTable("pool_shark_waiting_lists", {
	id: int().autoincrement().notNull(),
	tableId: int().notNull(),
	userId: int().notNull(),
	position: int().notNull(),
	joinedAt: timestamp({ mode: 'string' }).default('CURRENT_TIMESTAMP').notNull(),
},
(table) => [
	index("idx_pool_shark_waiting_lists_unique").on(table.tableId, table.userId),
	index("idx_pool_shark_waiting_lists_tableId").on(table.tableId),
	index("idx_pool_shark_waiting_lists_userId").on(table.userId),
]);

export const progressiveJackpots = mysqlTable("progressive_jackpots", {
	id: int().autoincrement().notNull(),
	name: varchar({ length: 255 }).notNull(),
	description: text(),
	currentAmount: decimal("current_amount", { precision: 18, scale: 2 }).default('0').notNull(),
	baseAmount: decimal("base_amount", { precision: 18, scale: 2 }).default('100').notNull(),
	contributionPercentage: float("contribution_percentage").default(0.5).notNull(),
	winProbability: float("win_probability").default(0.0001).notNull(),
	maxWinAmount: decimal("max_win_amount", { precision: 18, scale: 2 }),
	isActive: tinyint("is_active").default(1).notNull(),
	gameIds: text("game_ids"),
	lastWonBy: int("last_won_by"),
	lastWonAt: timestamp("last_won_at", { mode: 'string' }),
	lastWonAmount: decimal("last_won_amount", { precision: 18, scale: 2 }),
	totalWins: int("total_wins").default(0).notNull(),
	createdAt: timestamp("created_at", { mode: 'string' }).default('CURRENT_TIMESTAMP').notNull(),
	updatedAt: timestamp("updated_at", { mode: 'string' }).defaultNow().onUpdateNow().notNull(),
},
(table) => [
	index("idx_progressive_jackpots_isActive").on(table.isActive),
]);

export const promoBanners = mysqlTable("promo_banners", {
	id: int().autoincrement().notNull(),
	title: varchar({ length: 255 }).notNull(),
	subtitle: text(),
	description: text(),
	imageUrl: text(),
	linkUrl: text(),
	linkText: varchar({ length: 128 }),
	bgGradientFrom: varchar({ length: 32 }).default('#f59e0b'),
	bgGradientTo: varchar({ length: 32 }).default('#d97706'),
	textColor: varchar({ length: 32 }).default('#ffffff'),
	sortOrder: int().default(0).notNull(),
	isActive: tinyint().default(1).notNull(),
	startAt: timestamp({ mode: 'string' }),
	endAt: timestamp({ mode: 'string' }),
	createdByAdminId: int().notNull(),
	createdAt: timestamp({ mode: 'string' }).default('CURRENT_TIMESTAMP').notNull(),
	updatedAt: timestamp({ mode: 'string' }).defaultNow().onUpdateNow().notNull(),
},
(table) => [
	index("idx_promo_banners_isActive").on(table.isActive),
	index("idx_promo_banners_sortOrder").on(table.sortOrder),
]);

export const recentlyPlayed = mysqlTable("recently_played", {
	id: int().autoincrement().notNull(),
	userId: int().notNull(),
	gameId: int().notNull(),
	playedAt: timestamp({ mode: 'string' }).default('CURRENT_TIMESTAMP').notNull(),
},
(table) => [
	index("idx_recent_userId").on(table.userId),
]);

export const referrals = mysqlTable("referrals", {
	id: int().autoincrement().notNull(),
	referrerId: int().notNull(),
	refereeId: int().notNull(),
	referralCode: varchar({ length: 32 }).notNull(),
	referralLink: text().notNull(),
	source: mysqlEnum(['facebook','messenger','sms','twitter','instagram','email','other']).notNull(),
	status: mysqlEnum(['pending','completed','expired']).default('pending').notNull(),
	referrerRewardGiven: tinyint().default(0).notNull(),
	refereeRewardGiven: tinyint().default(0).notNull(),
	rewardAmount: int().default(1).notNull(),
	createdAt: timestamp({ mode: 'string' }).default('CURRENT_TIMESTAMP').notNull(),
	completedAt: timestamp({ mode: 'string' }),
},
(table) => [
	index("referrals_referralCode_unique").on(table.referralCode),
	index("idx_referrals_referrerId").on(table.referrerId),
	index("idx_referrals_refereeId").on(table.refereeId),
	index("idx_referrals_code").on(table.referralCode),
]);

export const restrictedStates = mysqlTable("restricted_states", {
	id: int().autoincrement().notNull(),
	stateCode: varchar({ length: 4 }).notNull(),
	stateName: varchar({ length: 128 }).notNull(),
	reason: text(),
	isActive: tinyint().default(1).notNull(),
	createdAt: timestamp({ mode: 'string' }).default('CURRENT_TIMESTAMP').notNull(),
},
(table) => [
	index("restricted_states_stateCode_unique").on(table.stateCode),
]);

export const rtpOverrides = mysqlTable("rtp_overrides", {
	id: int().autoincrement().notNull(),
	userId: int(),
	gameId: int(),
	rtpOverride: float().notNull(),
	setByAdminId: int().notNull(),
	reason: text(),
	expiresAt: timestamp({ mode: 'string' }),
	createdAt: timestamp({ mode: 'string' }).default('CURRENT_TIMESTAMP').notNull(),
});

export const scRedemptions = mysqlTable("sc_redemptions", {
	id: int().autoincrement().notNull(),
	userId: int().notNull(),
	scAmount: decimal({ precision: 18, scale: 2 }).notNull(),
	usdAmount: decimal({ precision: 18, scale: 2 }).notNull(),
	method: mysqlEnum(['bank_transfer','check','paypal','crypto']).notNull(),
	paymentDetails: json(),
	status: mysqlEnum(['pending','approved','processing','completed','rejected']).default('pending').notNull(),
	reviewedBy: int(),
	reviewNote: text(),
	createdAt: timestamp({ mode: 'string' }).default('CURRENT_TIMESTAMP').notNull(),
	processedAt: timestamp({ mode: 'string' }),
},
(table) => [
	index("idx_redemptions_userId").on(table.userId),
]);

export const seasonalEvents = mysqlTable("seasonal_events", {
	id: int().autoincrement().notNull(),
	name: varchar({ length: 255 }).notNull(),
	description: text(),
	type: mysqlEnum(['tournament','promotion','special_game','bonus_multiplier']).notNull(),
	status: mysqlEnum(['upcoming','active','completed']).default('upcoming').notNull(),
	startAt: timestamp({ mode: 'string' }).notNull(),
	endAt: timestamp({ mode: 'string' }).notNull(),
	bannerUrl: text(),
	rewardType: mysqlEnum(['gc','sc','multiplier','exclusive_access']).notNull(),
	rewardAmount: int().default(0),
	participantCount: int().default(0),
	maxParticipants: int(),
	metadata: json(),
	createdBy: int().notNull(),
	createdAt: timestamp({ mode: 'string' }).default('CURRENT_TIMESTAMP').notNull(),
	updatedAt: timestamp({ mode: 'string' }).defaultNow().onUpdateNow().notNull(),
},
(table) => [
	index("idx_event_status").on(table.status),
	index("idx_event_startAt").on(table.startAt),
]);

export const socialStream = mysqlTable("social_stream", {
	id: int().autoincrement().notNull(),
	userId: int().notNull(),
	activityType: mysqlEnum(['win','achievement_unlocked','tournament_joined','vip_tier_upgrade','milestone_reached','friend_added']).notNull(),
	title: varchar({ length: 255 }).notNull(),
	description: text(),
	metadata: json(),
	visibility: mysqlEnum(['public','friends_only','private']).default('public').notNull(),
	likeCount: int().default(0).notNull(),
	commentCount: int().default(0).notNull(),
	createdAt: timestamp({ mode: 'string' }).default('CURRENT_TIMESTAMP').notNull(),
},
(table) => [
	index("idx_social_stream_userId").on(table.userId),
	index("idx_social_stream_activityType").on(table.activityType),
	index("idx_social_stream_createdAt").on(table.createdAt),
]);

export const spinHistory = mysqlTable("spin_history", {
	id: int().autoincrement().notNull(),
	userId: int().notNull(),
	amount: decimal({ precision: 10, scale: 2 }).notNull(),
	currency: mysqlEnum(['GC','SC']).default('SC').notNull(),
	result: varchar({ length: 50 }).notNull(),
	createdAt: timestamp({ mode: 'string' }).default('CURRENT_TIMESTAMP').notNull(),
},
(table) => [
	index("idx_spin_history_userId").on(table.userId),
	index("idx_spin_history_createdAt").on(table.createdAt),
]);

export const sportBets = mysqlTable("sport_bets", {
	id: bigint({ mode: "number" }).autoincrement().notNull(),
	userId: int().notNull(),
	currency: mysqlEnum(['GC','SC']).notNull(),
	betType: mysqlEnum(['single','parlay','teaser']).default('single').notNull(),
	totalStake: decimal({ precision: 18, scale: 2 }).notNull(),
	totalOdds: float().notNull(),
	potentialPayout: decimal({ precision: 18, scale: 2 }).notNull(),
	actualPayout: decimal({ precision: 18, scale: 2 }).default('0.00'),
	status: mysqlEnum(['pending','won','lost','cancelled','partial_win','void']).default('pending').notNull(),
	selections: json().notNull(),
	settledAt: timestamp({ mode: 'string' }),
	createdAt: timestamp({ mode: 'string' }).default('CURRENT_TIMESTAMP').notNull(),
},
(table) => [
	index("idx_bets_userId").on(table.userId),
	index("idx_bets_status").on(table.status),
]);

export const sportEvents = mysqlTable("sport_events", {
	id: int().autoincrement().notNull(),
	sport: varchar({ length: 64 }).notNull(),
	league: varchar({ length: 128 }).notNull(),
	homeTeam: varchar({ length: 128 }).notNull(),
	awayTeam: varchar({ length: 128 }).notNull(),
	startTime: timestamp({ mode: 'string' }).notNull(),
	status: mysqlEnum(['upcoming','live','finished','cancelled','suspended']).default('upcoming').notNull(),
	homeScore: int().default(0),
	awayScore: int().default(0),
	period: varchar({ length: 32 }),
	odds: json(),
	metadata: json(),
	createdAt: timestamp({ mode: 'string' }).default('CURRENT_TIMESTAMP').notNull(),
	updatedAt: timestamp({ mode: 'string' }).defaultNow().onUpdateNow().notNull(),
},
(table) => [
	index("idx_events_sport").on(table.sport),
	index("idx_events_status").on(table.status),
]);

export const staff = mysqlTable("staff", {
	id: int().autoincrement().notNull(),
	userId: int().notNull(),
	staffId: varchar({ length: 32 }).notNull(),
	pin: varchar({ length: 255 }).notNull(),
	position: varchar({ length: 128 }).notNull(),
	department: varchar({ length: 128 }),
	hourlyRate: decimal({ precision: 10, scale: 2 }),
	isActive: tinyint().default(1).notNull(),
	createdAt: timestamp({ mode: 'string' }).default('CURRENT_TIMESTAMP').notNull(),
},
(table) => [
	index("staff_userId_unique").on(table.userId),
	index("staff_staffId_unique").on(table.staffId),
]);

export const streamInteractions = mysqlTable("stream_interactions", {
	id: int().autoincrement().notNull(),
	streamEntryId: int().notNull(),
	userId: int().notNull(),
	interactionType: mysqlEnum(['like','comment']).notNull(),
	content: text(),
	createdAt: timestamp({ mode: 'string' }).default('CURRENT_TIMESTAMP').notNull(),
},
(table) => [
	index("idx_stream_interactions_streamEntryId").on(table.streamEntryId),
	index("idx_stream_interactions_userId").on(table.userId),
]);

export const supportTickets = mysqlTable("support_tickets", {
	id: int().autoincrement().notNull(),
	userId: int().notNull(),
	assignedStaffId: int(),
	subject: varchar({ length: 255 }).notNull(),
	category: mysqlEnum(['account','payment','game','bonus','technical','kyc','other']).notNull(),
	priority: mysqlEnum(['low','medium','high','urgent']).default('medium').notNull(),
	status: mysqlEnum(['open','in_progress','waiting_user','resolved','closed']).default('open').notNull(),
	createdAt: timestamp({ mode: 'string' }).default('CURRENT_TIMESTAMP').notNull(),
	updatedAt: timestamp({ mode: 'string' }).defaultNow().onUpdateNow().notNull(),
	resolvedAt: timestamp({ mode: 'string' }),
},
(table) => [
	index("idx_tickets_userId").on(table.userId),
	index("idx_tickets_status").on(table.status),
]);

export const ticketMessages = mysqlTable("ticket_messages", {
	id: int().autoincrement().notNull(),
	ticketId: int().notNull(),
	senderId: int().notNull(),
	senderRole: mysqlEnum(['user','staff','admin']).notNull(),
	message: text().notNull(),
	attachmentUrl: text(),
	createdAt: timestamp({ mode: 'string' }).default('CURRENT_TIMESTAMP').notNull(),
},
(table) => [
	index("idx_messages_ticketId").on(table.ticketId),
]);

export const timeClock = mysqlTable("time_clock", {
	id: int().autoincrement().notNull(),
	staffId: int().notNull(),
	clockIn: timestamp({ mode: 'string' }).notNull(),
	clockOut: timestamp({ mode: 'string' }),
	hoursWorked: float(),
	notes: text(),
	createdAt: timestamp({ mode: 'string' }).default('CURRENT_TIMESTAMP').notNull(),
},
(table) => [
	index("idx_timeclock_staffId").on(table.staffId),
]);

export const tournamentParticipants = mysqlTable("tournament_participants", {
	id: int().autoincrement().notNull(),
	tournamentId: int().notNull(),
	userId: int().notNull(),
	score: decimal({ precision: 15, scale: 2 }).default('0.00').notNull(),
	finalRank: int(),
	prizeWon: decimal({ precision: 15, scale: 2 }).default('0.00'),
	joinedAt: timestamp({ mode: 'string' }).default('CURRENT_TIMESTAMP').notNull(),
	completedAt: timestamp({ mode: 'string' }),
},
(table) => [
	index("idx_tournament_participants_tournamentId").on(table.tournamentId),
	index("idx_tournament_participants_userId").on(table.userId),
]);

export const tournamentSnapshots = mysqlTable("tournament_snapshots", {
	id: int().autoincrement().notNull(),
	tournamentId: int().notNull(),
	snapshotTime: timestamp({ mode: 'string' }).default('CURRENT_TIMESTAMP').notNull(),
	topPlayers: json(),
},
(table) => [
	index("idx_tournament_snapshots_tournamentId").on(table.tournamentId),
]);

export const tournaments = mysqlTable("tournaments", {
	id: int().autoincrement().notNull(),
	name: varchar({ length: 255 }).notNull(),
	description: text(),
	gameId: int(),
	status: mysqlEnum(['upcoming','active','completed','cancelled']).default('upcoming').notNull(),
	startAt: timestamp({ mode: 'string' }).notNull(),
	endAt: timestamp({ mode: 'string' }).notNull(),
	entryFeeGc: int().default(0).notNull(),
	maxParticipants: int(),
	currentParticipants: int().default(0).notNull(),
	prizePool: decimal({ precision: 15, scale: 2 }).default('0.00').notNull(),
	prizeDistribution: json(),
	leaderboardId: int(),
	createdBy: int().notNull(),
	createdAt: timestamp({ mode: 'string' }).default('CURRENT_TIMESTAMP').notNull(),
	updatedAt: timestamp({ mode: 'string' }).defaultNow().onUpdateNow().notNull(),
},
(table) => [
	index("idx_tournament_status").on(table.status),
	index("idx_tournament_gameId").on(table.gameId),
	index("idx_tournament_startAt").on(table.startAt),
]);

export const transactions = mysqlTable("transactions", {
	id: bigint({ mode: "number" }).autoincrement().notNull(),
	userId: int().notNull(),
	type: mysqlEnum(['gc_purchase','gc_bonus','sc_bonus','sc_redeem','game_bet','game_win','sport_bet','sport_win','sport_refund','poker_buyin','poker_win','poker_rake','bingo_purchase','bingo_win','minigame_bet','minigame_win','daily_bonus','admin_credit','admin_debit','referral_bonus','promo_credit']).notNull(),
	currency: mysqlEnum(['GC','SC']).notNull(),
	amount: decimal({ precision: 18, scale: 2 }).notNull(),
	balanceBefore: decimal({ precision: 18, scale: 2 }).notNull(),
	balanceAfter: decimal({ precision: 18, scale: 2 }).notNull(),
	referenceId: varchar({ length: 128 }),
	referenceType: varchar({ length: 64 }),
	description: text(),
	metadata: json(),
	createdAt: timestamp({ mode: 'string' }).default('CURRENT_TIMESTAMP').notNull(),
},
(table) => [
	index("idx_transactions_userId").on(table.userId),
	index("idx_transactions_createdAt").on(table.createdAt),
]);

export const userAchievements = mysqlTable("user_achievements", {
	id: int().autoincrement().notNull(),
	userId: int().notNull(),
	achievementId: int().notNull(),
	unlockedAt: timestamp({ mode: 'string' }).default('CURRENT_TIMESTAMP').notNull(),
	rewardClaimed: tinyint().default(0).notNull(),
},
(table) => [
	index("idx_user_achievements_unique").on(table.userId, table.achievementId),
	index("idx_user_achievements_userId").on(table.userId),
	index("idx_user_achievements_achievementId").on(table.achievementId),
]);

export const userFavorites = mysqlTable("user_favorites", {
	id: int().autoincrement().notNull(),
	userId: int().notNull(),
	gameId: int().notNull(),
	createdAt: timestamp({ mode: 'string' }).default('CURRENT_TIMESTAMP').notNull(),
},
(table) => [
	index("idx_user_favorites_unique").on(table.userId, table.gameId),
	index("idx_user_favorites_userId").on(table.userId),
	index("idx_user_favorites_gameId").on(table.gameId),
]);

export const userVipStatus = mysqlTable("user_vip_status", {
	id: int().autoincrement().notNull(),
	userId: int().notNull(),
	currentVipTierId: int(),
	lifetimeWinnings: decimal({ precision: 15, scale: 2 }).default('0.00').notNull(),
	totalBetsPlaced: decimal({ precision: 15, scale: 2 }).default('0.00').notNull(),
	weeklyBonusClaimedAt: timestamp({ mode: 'string' }),
	monthlyBonusClaimedAt: timestamp({ mode: 'string' }),
	lastVipUpgradeAt: timestamp({ mode: 'string' }),
	updatedAt: timestamp({ mode: 'string' }).defaultNow().onUpdateNow().notNull(),
	createdAt: timestamp({ mode: 'string' }).default('CURRENT_TIMESTAMP').notNull(),
},
(table) => [
	index("user_vip_status_userId_unique").on(table.userId),
	index("idx_user_vip_userId").on(table.userId),
]);

export const users = mysqlTable("users", {
	id: int().autoincrement().notNull(),
	openId: varchar({ length: 64 }).notNull(),
	name: text(),
	email: varchar({ length: 320 }),
	loginMethod: varchar({ length: 64 }),
	role: mysqlEnum(['user','staff','admin']).default('user').notNull(),
	createdAt: timestamp({ mode: 'string' }).default('CURRENT_TIMESTAMP').notNull(),
	updatedAt: timestamp({ mode: 'string' }).defaultNow().onUpdateNow().notNull(),
	lastSignedIn: timestamp({ mode: 'string' }).default('CURRENT_TIMESTAMP').notNull(),
	username: varchar({ length: 64 }),
	passwordHash: varchar({ length: 255 }),
	kycStatus: mysqlEnum(['none','pending','approved','rejected']).default('none').notNull(),
	kycLevel: int().default(0).notNull(),
	isBanned: tinyint().default(0).notNull(),
	banReason: text(),
	isAgeVerified: tinyint().default(0).notNull(),
	dateOfBirth: varchar({ length: 10 }),
	stateCode: varchar({ length: 4 }),
	country: varchar({ length: 4 }).default('US'),
	phone: varchar({ length: 32 }),
	avatarUrl: text(),
	lastIp: varchar({ length: 64 }),
	twoFactorEnabled: tinyint().default(0).notNull(),
	twoFactorSecret: varchar({ length: 64 }),
	stripeCustomerId: varchar({ length: 255 }),
},
(table) => [
	index("users_openId_unique").on(table.openId),
	index("users_username_unique").on(table.username),
	index("users_stripeCustomerId_unique").on(table.stripeCustomerId),
]);

export const vipTiers = mysqlTable("vip_tiers", {
	id: int().autoincrement().notNull(),
	name: varchar({ length: 64 }).notNull(),
	minLifetimeWinnings: decimal({ precision: 15, scale: 2 }).notNull(),
	bonusMultiplier: decimal({ precision: 3, scale: 2 }).default('1.00').notNull(),
	weeklyBonusGc: int().default(0).notNull(),
	monthlyBonusGc: int().default(0).notNull(),
	exclusiveGames: json(),
	prioritySupport: tinyint().default(0).notNull(),
	customAvatarFrame: tinyint().default(0).notNull(),
	badgeIcon: text(),
	description: text(),
	createdAt: timestamp({ mode: 'string' }).default('CURRENT_TIMESTAMP').notNull(),
},
(table) => [
	index("idx_vip_tier_minWinnings").on(table.minLifetimeWinnings),
]);

export const wallets = mysqlTable("wallets", {
	id: int().autoincrement().notNull(),
	userId: int().notNull(),
	gcBalance: decimal({ precision: 18, scale: 2 }).default('0.00').notNull(),
	scBalance: decimal({ precision: 18, scale: 2 }).default('0.00').notNull(),
	lifetimeGcEarned: decimal({ precision: 18, scale: 2 }).default('0.00').notNull(),
	lifetimeScEarned: decimal({ precision: 18, scale: 2 }).default('0.00').notNull(),
	lifetimeScRedeemed: decimal({ precision: 18, scale: 2 }).default('0.00').notNull(),
	updatedAt: timestamp({ mode: 'string' }).defaultNow().onUpdateNow().notNull(),
});

export const winShareEvents = mysqlTable("win_share_events", {
	id: int().autoincrement().notNull(),
	userId: int().notNull(),
	gameId: int().notNull(),
	winAmount: decimal({ precision: 15, scale: 2 }).notNull(),
	shareMessage: text().notNull(),
	platform: mysqlEnum(['facebook','messenger','sms','twitter']).notNull(),
	referralCode: varchar({ length: 32 }).notNull(),
	sharedAt: timestamp({ mode: 'string' }).default('CURRENT_TIMESTAMP').notNull(),
	clickCount: int().default(0).notNull(),
},
(table) => [
	index("idx_win_share_userId").on(table.userId),
	index("idx_win_share_gameId").on(table.gameId),
]);
