import { apiRequest, extractItems } from './client' import type { AchievementDto, AuthResponse, CoinTransactionDto, CourseDto, CreateLectureRequest, LectureDto, LectureQuery, LocationDto, PagedResult, ReviewDto, ReviewQuery, SyncResultDto, SyncScheduleRequest, SyncStatusDto, TagDto, UserAchievementDto, UserDto, UserQuery, UserNotificationDto, 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}`), create: (payload: CreateLectureRequest) => apiRequest('/lectures', { method: 'POST', body: JSON.stringify(payload), }), 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< PagedResult | 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 notificationsApi = { async list() { const payload = await apiRequest | UserNotificationDto[]>( '/notifications', ) return extractItems(payload) }, markAllRead: () => apiRequest('/notifications/read-all', { method: 'PATCH' }), } function normalizePagedResult( payload: PagedResult | T[] | undefined, query: { Page?: number; PageSize?: number } = {}, ): PagedResult { if (!Array.isArray(payload) && payload) return payload const items = payload ?? [] const page = query.Page ?? 1 const pageSize = query.PageSize ?? items.length const totalPages = pageSize > 0 ? Math.ceil(items.length / pageSize) : 0 return { items, totalCount: items.length, page, pageSize, totalPages, } } async function listReviewsPage(query: ReviewQuery = {}) { const payload = await apiRequest | ReviewDto[]>('/reviews', { query: query as Record, }) return normalizePagedResult(payload, query) } async function listPendingReviewsPage(query: ReviewQuery = {}) { const payload = await apiRequest | ReviewDto[]>('/reviews/pending', { query: query as Record, }) return normalizePagedResult(payload, query) } 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 }), }), listPage: listReviewsPage, async list(query: ReviewQuery = { PageSize: 100 }) { return (await listReviewsPage(query)).items }, pendingPage: listPendingReviewsPage, async pending(query: ReviewQuery = { PageSize: 100 }) { return (await listPendingReviewsPage(query)).items }, 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' }), }