import { apiRequest, extractItems } from './client' import type { AchievementDto, AuthResponse, CoinTransactionDto, CourseDto, LectureDto, LectureQuery, LocationDto, PagedResult, ReviewDto, SyncResultDto, SyncScheduleRequest, SyncStatusDto, TagDto, UserAchievementDto, UserDto, UserQuery, UserStatsDto, } from './types' export const authApi = { loginMicrosoft: (authorizationCode: string, redirectUri?: string) => apiRequest('/auth/login/microsoft', { method: 'POST', body: JSON.stringify({ authorizationCode, redirectUri }), }), refresh: () => apiRequest('/auth/refresh', { method: 'POST' }), logout: () => apiRequest('/auth/logout', { method: 'POST' }), me: () => apiRequest('/auth/me'), } export const lecturesApi = { async list(query: LectureQuery = {}) { const payload = await apiRequest | LectureDto[]>('/lectures', { query: query as Record, }) return extractItems(payload) }, get: (id: string | number) => apiRequest(`/lectures/${id}`), enroll: (id: string | number) => apiRequest(`/lectures/${id}/enroll`, { method: 'POST' }), unenroll: (id: string | number) => apiRequest(`/lectures/${id}/enroll`, { method: 'DELETE' }), async reviews(id: string | number) { const payload = await apiRequest | ReviewDto[]>(`/lectures/${id}/reviews`) return extractItems(payload) }, } export const usersApi = { get: (id: string | number) => apiRequest(`/users/${id}`), async list(query: UserQuery = {}) { const payload = await apiRequest | UserDto[]>('/users', { query: query as Record, }) return extractItems(payload) }, stats: (id: string | number) => apiRequest(`/users/${id}/stats`), async enrollments(id: string | number) { const payload = await apiRequest | LectureDto[] | undefined>(`/users/${id}/enrollments`) return extractItems(payload) }, async achievements(id: string | number) { const payload = await apiRequest | UserAchievementDto[] | AchievementDto[]>( `/users/${id}/achievements`, ) if (Array.isArray(payload)) return payload return payload.items ?? [] }, async transactions(id: string | number) { const payload = await apiRequest | CoinTransactionDto[]>( `/users/${id}/transactions`, ) return extractItems(payload) }, setRole: (id: string | number, roles: Array<'Student' | 'Teacher' | 'Admin'>) => apiRequest(`/users/${id}/role`, { method: 'PATCH', body: JSON.stringify(roles) }), setActive: (id: string | number, isActive: boolean) => apiRequest(`/users/${id}/active`, { method: 'PATCH', body: JSON.stringify(isActive) }), } export const achievementsApi = { async list() { const payload = await apiRequest | AchievementDto[]>('/achievements') return extractItems(payload) }, } export const reviewsApi = { create: (lectureId: string | number, rating: 'Like' | 'Neutral' | 'Dislike', text: string) => apiRequest('/reviews', { method: 'POST', body: JSON.stringify({ lectureId: Number(lectureId), rating, text }), }), async pending() { const payload = await apiRequest | ReviewDto[]>('/reviews/pending') return extractItems(payload) }, reanalyze: (id: string | number) => apiRequest(`/reviews/${id}/reanalyze`, { method: 'POST' }), } export const coursesApi = { async list() { const payload = await apiRequest | CourseDto[]>('/courses', { query: { PageSize: 100 } }) return extractItems(payload) }, } export const locationsApi = { async list() { const payload = await apiRequest | LocationDto[]>('/locations') return extractItems(payload) }, } export const tagsApi = { async list() { const payload = await apiRequest | TagDto[]>('/tags') return extractItems(payload) }, } export const syncApi = { status: () => apiRequest('/sync/status'), schedule: (request: SyncScheduleRequest) => apiRequest('/sync/schedule', { method: 'POST', body: JSON.stringify(request), }), rooms: () => apiRequest('/sync/rooms', { method: 'POST' }), }