export class ApiError extends Error { constructor( public status: number, public code: string, message: string, public details?: unknown, ) { super(message); } } export const errors = { badRequest: (msg = "Bad request", details?: unknown) => new ApiError(400, "BAD_REQUEST", msg, details), unauthorized: (msg = "Please sign in.") => new ApiError(401, "UNAUTHORIZED", msg), forbidden: (msg = "Forbidden") => new ApiError(403, "FORBIDDEN", msg), notFound: (msg = "Not found") => new ApiError(404, "NOT_FOUND", msg), conflict: (code: string, msg: string) => new ApiError(409, code, msg), rateLimited: (retryAfter: number) => new ApiError(429, "RATE_LIMITED", "Too many requests. Please slow down.", { retryAfter }), insufficient: (balance: number, bet: number) => new ApiError(402, "INSUFFICIENT_CREDITS", "Not enough Spinza Credits for this bet.", { balance, bet }), maintenance: (message: string) => new ApiError(503, "MAINTENANCE", message), unavailable: (msg = "Game unavailable") => new ApiError(503, "GAME_UNAVAILABLE", msg), };