export interface Game { id?: number; pgn?: string; white?: User; black?: User; winner?: "white" | "black" | "draw"; endReason?: "draw" | "checkmate" | "stalemate" | "repetition" | "insufficient" | "abandoned" | "timeout" | "resign"; host?: User; code?: string; unlisted?: boolean; timeout?: number; observers?: User[]; startedAt?: number; endedAt?: number; vsAi?: boolean; aiLevel?: number; timeControl?: number; whiteTimeMs?: number; blackTimeMs?: number; lastMoveAt?: number; } export interface User { id?: number | string; // string for guest IDs name?: string | null; email?: string; wins?: number; losses?: number; draws?: number; role?: "user" | "admin"; // mainly for players, not spectators connected?: boolean; disconnectedOn?: number; } export interface FriendRequest { id?: number; fromId?: number; toId?: number; fromName?: string; toName?: string; status?: "pending" | "accepted" | "rejected"; createdAt?: string; } export interface Friendship { id?: number; userId?: number; friendId?: number; friendName?: string; wins?: number; losses?: number; draws?: number; createdAt?: string; } export interface CorrespondenceGame { id?: number; code?: string; white?: { id?: number; name?: string }; black?: { id?: number; name?: string }; pgn?: string; winner?: "white" | "black" | "draw"; endReason?: "checkmate" | "stalemate" | "repetition" | "insufficient" | "resign" | "timeout" | "draw"; daysPerMove?: number; lastMoveAt?: number; startedAt?: number; endedAt?: number; } export interface Tournament { id?: number; code?: string; name?: string; hostId?: number; hostName?: string; status?: "waiting" | "active" | "finished"; timeControl?: number; maxPlayers?: number; currentRound?: number; totalRounds?: number; players?: TournamentPlayer[]; rounds?: TournamentRound[]; createdAt?: number; } export interface TournamentPlayer { tournamentId?: number; userId?: number; userName?: string; score?: number; gamesPlayed?: number; } export type NotificationType = "friendRequest" | "friendAccepted" | "gameInvite"; export interface AppNotification { id: string; type: NotificationType; fromId: number; fromName: string; gameCode?: string; createdAt: number; read: boolean; } export interface TournamentRound { id?: number; tournamentId?: number; round?: number; gameCode?: string; gameId?: number; whiteId?: number; whiteName?: string; blackId?: number; blackName?: string; result?: "white" | "black" | "draw" | null; }