import { User, AuthResponse, PublicGolferStats, CommunityComparisonData } from '../types/auth'; import { Round, TrackingSettings, Course } from '../types/golf'; const AUTH_TOKEN_KEY = 'pinpoint_auth_token_v1'; export function getStoredToken(): string | null { return localStorage.getItem(AUTH_TOKEN_KEY); } export function setStoredToken(token: string | null): void { if (token) { localStorage.setItem(AUTH_TOKEN_KEY, token); } else { localStorage.removeItem(AUTH_TOKEN_KEY); } } async function request(endpoint: string, options: RequestInit = {}): Promise { const token = getStoredToken(); const headers: Record = { 'Content-Type': 'application/json', ...(options.headers as Record), }; if (token) { headers['Authorization'] = `Bearer ${token}`; } const response = await fetch(endpoint, { ...options, headers, }); if (!response.ok) { let errorMsg = `Request failed: ${response.statusText}`; try { const errorJson = await response.json(); if (errorJson && errorJson.error) { errorMsg = errorJson.error; } } catch { // Ignore json parse error } throw new Error(errorMsg); } return response.json(); } export const authApi = { async register(data: { email: string; username: string; password: string; name?: string; handicapIndex?: number; homeClub?: string; isPublic?: boolean; }): Promise { return request('/api/auth/register', { method: 'POST', body: JSON.stringify(data), }); }, async login(identifier: string, password: string): Promise { return request('/api/auth/login', { method: 'POST', body: JSON.stringify({ identifier, password }), }); }, async getMe(): Promise<{ user: User; settings: TrackingSettings }> { return request<{ user: User; settings: TrackingSettings }>('/api/auth/me'); }, async updateProfile(updates: Partial): Promise<{ user: User }> { return request<{ user: User }>('/api/auth/profile', { method: 'PUT', body: JSON.stringify(updates), }); }, async ssoLogin(data: { provider: string; email?: string; username?: string; name?: string; avatarUrl?: string; authentikServerUrl?: string; }): Promise { return request('/api/auth/oauth/sso-login', { method: 'POST', body: JSON.stringify(data), }); }, async getProviders(): Promise<{ providers: Array<{ id: string; name: string; icon: string; isConfigured: boolean; issuerUrl?: string; authUrlEndpoint: string; }>; }> { return request('/api/auth/oauth/providers'); }, async getSettings(): Promise { return request('/api/auth/settings'); }, async updateSettings(settings: TrackingSettings): Promise { return request('/api/auth/settings', { method: 'PUT', body: JSON.stringify(settings), }); }, }; export const roundsApi = { async getRounds(): Promise { return request('/api/rounds'); }, async saveRound(round: Round): Promise { return request('/api/rounds', { method: 'POST', body: JSON.stringify(round), }); }, async syncBatch(rounds: Round[]): Promise<{ count: number; rounds: Round[] }> { return request<{ count: number; rounds: Round[] }>('/api/rounds/sync-batch', { method: 'POST', body: JSON.stringify({ rounds }), }); }, async deleteRound(id: string): Promise<{ success: boolean }> { return request<{ success: boolean }>(`/api/rounds/${id}`, { method: 'DELETE', }); }, async getCustomCourses(): Promise { return request('/api/rounds/courses/custom'); }, async saveCustomCourse(course: Course): Promise { return request('/api/rounds/courses/custom', { method: 'POST', body: JSON.stringify(course), }); }, }; export const communityApi = { async getLeaderboard(): Promise<{ totalCount: number; golfers: PublicGolferStats[] }> { return request<{ totalCount: number; golfers: PublicGolferStats[] }>('/api/community/leaderboard'); }, async getComparison(): Promise { return request('/api/community/compare'); }, };