import { api } from '../axios'; import { Track, Exercise, ExerciseResult, Progress, SkillMapData, TrackProgress, StartExerciseRequest, StartExerciseResponse, SubmitExerciseRequest, SubmitExerciseResponse, UseHintRequest, UseHintResponse, TrackSearchParams, PaginatedResponse, PaginationParams, } from '../types'; export const trainingApi = { // Get all tracks getTracks: ( params?: TrackSearchParams & PaginationParams ): Promise> => { return api.get>('/training/tracks', { params }); }, // Get track by ID getTrack: (trackId: string): Promise => { return api.get(`/training/tracks/${trackId}`); }, // Get track by slug getTrackBySlug: (slug: string): Promise => { return api.get(`/training/tracks/slug/${slug}`); }, // Enroll in track enrollInTrack: (trackId: string): Promise => { return api.post(`/training/tracks/${trackId}/enroll`); }, // Unenroll from track unenrollFromTrack: (trackId: string): Promise => { return api.delete(`/training/tracks/${trackId}/enroll`); }, // Get track progress getTrackProgress: (trackId: string): Promise => { return api.get(`/training/tracks/${trackId}/progress`); }, // Get exercise by ID getExercise: (exerciseId: string): Promise => { return api.get(`/training/exercises/${exerciseId}`); }, // Get exercise by slug getExerciseBySlug: (trackSlug: string, exerciseSlug: string): Promise => { return api.get( `/training/tracks/slug/${trackSlug}/exercises/slug/${exerciseSlug}` ); }, // Start exercise startExercise: (data: StartExerciseRequest): Promise => { return api.post('/training/exercises/start', data); }, // Submit exercise submitExercise: (data: SubmitExerciseRequest): Promise => { return api.post('/training/exercises/submit', data); }, // Get exercise result getExerciseResult: (exerciseId: string): Promise => { return api.get( `/training/exercises/${exerciseId}/result` ); }, // Get available hints getAvailableHints: (exerciseId: string): Promise<{ hints: Array<{ id: string; order: number; title: string; isUnlocked: boolean; costPercentage: number; }>; usedHints: number; totalHints: number; }> => { return api.get(`/training/exercises/${exerciseId}/hints`); }, // Use hint useHint: (data: UseHintRequest): Promise => { return api.post('/training/exercises/use-hint', data); }, // Get overall progress getProgress: (): Promise => { return api.get('/training/progress'); }, // Get skill map getSkillMap: (): Promise => { return api.get('/training/skill-map'); }, // Get recommended tracks getRecommendedTracks: (limit?: number): Promise => { return api.get('/training/recommendations/tracks', { params: { limit }, }); }, // Get recommended exercises getRecommendedExercises: (limit?: number): Promise => { return api.get('/training/recommendations/exercises', { params: { limit }, }); }, // Get featured tracks getFeaturedTracks: (): Promise => { return api.get('/training/tracks/featured'); }, // Get popular tracks getPopularTracks: (limit?: number): Promise => { return api.get('/training/tracks/popular', { params: { limit }, }); }, // Get enrolled tracks getEnrolledTracks: (): Promise => { return api.get('/training/my-tracks'); }, // Get completed tracks getCompletedTracks: (): Promise => { return api.get('/training/completed-tracks'); }, // Get exercise history (all attempts) getExerciseHistory: ( exerciseId: string ): Promise> => { return api.get(`/training/exercises/${exerciseId}/history`); }, // Reset exercise progress resetExerciseProgress: (exerciseId: string): Promise => { return api.post(`/training/exercises/${exerciseId}/reset`); }, // Get daily challenge getDailyChallenge: (): Promise => { return api.get('/training/daily-challenge'); }, // Get streak info getStreakInfo: (): Promise<{ currentStreak: number; longestStreak: number; lastActivityDate: string; streakFreezeAvailable: boolean; }> => { return api.get('/training/streak'); }, // Use streak freeze useStreakFreeze: (): Promise<{ success: boolean; freezesRemaining: number }> => { return api.post('/training/streak/freeze'); }, // Get certificates getCertificates: (): Promise> => { return api.get('/training/certificates'); }, // Generate certificate for completed track generateCertificate: (trackId: string): Promise<{ certificateUrl: string; verificationCode: string; }> => { return api.post(`/training/tracks/${trackId}/certificate`); }, // Get leaderboard for track getTrackLeaderboard: ( trackId: string, params?: PaginationParams ): Promise> => { return api.get(`/training/tracks/${trackId}/leaderboard`, { params }); }, // Rate track rateTrack: ( trackId: string, rating: number, feedback?: string ): Promise<{ averageRating: number }> => { return api.post(`/training/tracks/${trackId}/rate`, { rating, feedback }); }, // Report issue with exercise reportExerciseIssue: ( exerciseId: string, type: 'bug' | 'unclear' | 'incorrect' | 'other', description: string ): Promise => { return api.post(`/training/exercises/${exerciseId}/report`, { type, description, }); }, }; export default trainingApi;