import type { ActionResponse, AddMemoryRequest, AnswerTriviaRequest, CollectItemRequest, ContentResponse, CreateUserRequest, CreateUserResponse, LeaderboardEntry, LeaderboardResponse, PassportState, SubmitPredictionRequest } from '@fan-passport/shared'; const API_BASE_URL = (import.meta.env.VITE_API_BASE_URL ?? 'http://localhost:4000/api').replace(/\/$/, ''); export class ApiClientError extends Error { public readonly status: number; public readonly details?: unknown; constructor(message: string, status: number, details?: unknown) { super(message); this.name = 'ApiClientError'; this.status = status; this.details = details; } } async function request(path: string, options: RequestInit = {}): Promise { const response = await fetch(`${API_BASE_URL}${path}`, { ...options, headers: { Accept: 'application/json', 'Content-Type': 'application/json', ...options.headers } }); const text = await response.text(); const parsed = text ? JSON.parse(text) : null; if (!response.ok) { const message = parsed?.error?.message ?? `Request failed with status ${response.status}`; const details = parsed?.error?.details; throw new ApiClientError(message, response.status, details); } return parsed as T; } export const api = { getContent(): Promise { return request('/content'); }, createUser(body: CreateUserRequest): Promise { return request('/users', { method: 'POST', body: JSON.stringify(body) }); }, getPassport(userId: string): Promise { return request(`/passport/${encodeURIComponent(userId)}`); }, getLeaderboard(): Promise { return request('/leaderboard').then((response) => response.leaderboard); }, collectItem(body: CollectItemRequest): Promise { return request('/collect', { method: 'POST', body: JSON.stringify(body) }); }, answerTrivia(questionId: string, body: AnswerTriviaRequest): Promise { return request(`/trivia/${encodeURIComponent(questionId)}/answer`, { method: 'POST', body: JSON.stringify(body) }); }, submitPrediction(body: SubmitPredictionRequest): Promise { return request('/predictions', { method: 'POST', body: JSON.stringify(body) }); }, addMemory(body: AddMemoryRequest): Promise { return request('/memories', { method: 'POST', body: JSON.stringify(body) }); }, resetDemo(): Promise<{ ok: true }> { return request<{ ok: true }>('/demo/reset', { method: 'POST' }); } };