import { authenticatedMutation, getAuthState, request, SaasApiError } from '../saas/saas-api';
import type { AdminLearnCourse, AdminLearnLesson, LearnCertificate, LearnCourseSummary, LearnImportAnalysis, LearnImportBatch, LearnImportSummary, LearnMedia, PublicLearnCourse, PublicLearnLesson } from './types';

export async function listLearnCourses(query=''):Promise<LearnCourseSummary[]>{return (await request<{courses:LearnCourseSummary[]}>(`/api/learn/courses${query?`?q=${encodeURIComponent(query)}`:''}`)).courses;}
export async function getLearnCourse(slug:string):Promise<PublicLearnCourse>{return (await request<{course:PublicLearnCourse}>(`/api/learn/courses/${encodeURIComponent(slug)}`)).course;}
export async function getLearnLesson(course:string,lesson:string):Promise<PublicLearnLesson>{return (await request<{lesson:PublicLearnLesson}>(`/api/learn/courses/${encodeURIComponent(course)}/lessons/${encodeURIComponent(lesson)}`)).lesson;}
export async function enrollLearnCourse(slug:string){return authenticatedMutation(`/api/learn/courses/${encodeURIComponent(slug)}/enroll`,'POST',{});}
export async function saveItemProgress(courseSlug:string,itemSlug:string,status:'started'|'completed',progressPercent?:number){return authenticatedMutation('/api/learn/progress','POST',{courseSlug,itemSlug,status,progressPercent});}
export async function saveBlockProgress(courseSlug:string,lessonSlug:string,blockId:string,status:'started'|'completed',state?:Record<string,unknown>){return (await authenticatedMutation<{progress:{blockId:string;status:'started'|'completed';lessonCompleted:boolean}}>(`/api/learn/courses/${encodeURIComponent(courseSlug)}/lessons/${encodeURIComponent(lessonSlug)}/blocks/${encodeURIComponent(blockId)}/progress`,'POST',{status,state})).progress;}
export async function gradeCheckpoint(courseSlug:string,lessonSlug:string,blockId:string,answer:number|number[]){return authenticatedMutation<{result:{correct:boolean;explanation?:string;lessonCompleted?:boolean}}>(`/api/learn/courses/${encodeURIComponent(courseSlug)}/lessons/${encodeURIComponent(lessonSlug)}/blocks/${encodeURIComponent(blockId)}/checkpoint`,'POST',{answer});}
export async function runCodeExercise(courseSlug:string,lessonSlug:string,blockId:string,files:Record<string,string>,entryFile?:string,stdin=''){return (await authenticatedMutation<{result:{status:string;exitCode:number;stdout:string;stderr:string;projectModeId:string;entry:string}}>(`/api/learn/courses/${encodeURIComponent(courseSlug)}/lessons/${encodeURIComponent(lessonSlug)}/blocks/${encodeURIComponent(blockId)}/run`,'POST',{files,entryFile,stdin})).result;}
export async function checkCodeExercise(courseSlug:string,lessonSlug:string,blockId:string,files:Record<string,string>,entryFile?:string){return (await authenticatedMutation<{result:{passed:boolean;lessonCompleted:boolean;exitCode:number;stdout:string;stderr:string;visibleTests:Array<{index:number;label:string;passed:boolean;exitCode:number;stdout:string;stderr:string}>;hiddenTests:{passed:number;total:number}}}>(`/api/learn/courses/${encodeURIComponent(courseSlug)}/lessons/${encodeURIComponent(lessonSlug)}/blocks/${encodeURIComponent(blockId)}/check`,'POST',{files,entryFile})).result;}
export async function runLearnCode(courseSlug:string,lessonSlug:string,blockId:string,code:string,stdin=''){return (await authenticatedMutation<{result:{status:string;exitCode:number;stdout:string;stderr:string;projectModeId:string;entry:string}}>(`/api/learn/courses/${encodeURIComponent(courseSlug)}/lessons/${encodeURIComponent(lessonSlug)}/blocks/${encodeURIComponent(blockId)}/run-code`,'POST',{code,stdin})).result;}
export async function getSolution(courseSlug:string,lessonSlug:string,blockId:string){return (await request<{solution:{title:string;content:string}}>(`/api/learn/courses/${encodeURIComponent(courseSlug)}/lessons/${encodeURIComponent(lessonSlug)}/blocks/${encodeURIComponent(blockId)}/solution`)).solution;}
export async function startTerminalTask(courseSlug:string,lessonSlug:string,blockId:string){return authenticatedMutation<{attempt:{id:string;attemptNumber:number;projectId:string;generation:number};terminalSession:import('../saas/saas-api').LinuxTerminalSession}>(`/api/learn/courses/${encodeURIComponent(courseSlug)}/lessons/${encodeURIComponent(lessonSlug)}/blocks/${encodeURIComponent(blockId)}/terminal-task/start`,'POST',{});}
export async function verifyTerminalTask(courseSlug:string,lessonSlug:string,blockId:string,attemptId:string){return (await authenticatedMutation<{result:{passed:boolean;lessonCompleted:boolean;feedbackMode:'detailed'|'summary'|'exam';message?:string;checks?:Array<{label:string;passed:boolean}>}}>(`/api/learn/courses/${encodeURIComponent(courseSlug)}/lessons/${encodeURIComponent(lessonSlug)}/blocks/${encodeURIComponent(blockId)}/terminal-task/${encodeURIComponent(attemptId)}/verify`,'POST',{})).result;}
export async function resetTerminalTask(courseSlug:string,lessonSlug:string,blockId:string,attemptId:string){return authenticatedMutation<{ok:boolean;attemptId:string}>(`/api/learn/courses/${encodeURIComponent(courseSlug)}/lessons/${encodeURIComponent(lessonSlug)}/blocks/${encodeURIComponent(blockId)}/terminal-task/${encodeURIComponent(attemptId)}/reset`,'POST',{});}

export async function adminListCourses(input:{page?:number;pageSize?:number;query?:string;status?:string;accessTier?:string;sort?:string}={}):Promise<LearnCourseSummary[]>{return (await adminListCoursesPage(input)).items;}
export async function adminListCoursesPage(input:{page?:number;pageSize?:number;query?:string;status?:string;accessTier?:string;sort?:string}={}):Promise<{items:LearnCourseSummary[];page:number;pageSize:number;total:number}>{const params=new URLSearchParams();if(input.page)params.set('page',String(input.page));if(input.pageSize)params.set('pageSize',String(input.pageSize));if(input.query)params.set('q',input.query);if(input.status)params.set('status',input.status);if(input.accessTier)params.set('accessTier',input.accessTier);if(input.sort)params.set('sort',input.sort);const payload=await request<{items?:LearnCourseSummary[];courses:LearnCourseSummary[];page:number;pageSize:number;total:number}>(`/api/admin/learn${params.size?`?${params}`:''}`);return{items:payload.items||payload.courses,page:payload.page||1,pageSize:payload.pageSize||25,total:payload.total??payload.courses.length};}
export async function adminBulkCourses(ids:number[],action:'publish'|'draft'|'archive'|'delete'){return authenticatedMutation('/api/admin/learn/courses/bulk','POST',{ids,action});}
export async function adminPreviewCourse(id:number):Promise<AdminLearnCourse>{return (await request<{item:AdminLearnCourse}>(`/api/admin/learn/courses/${id}/preview`)).item;}
export async function adminPreviewLesson(id:number):Promise<PublicLearnLesson>{return (await request<{item:PublicLearnLesson}>(`/api/admin/learn/lessons/${id}/preview`)).item;}
export async function adminGetCourse(id:number):Promise<AdminLearnCourse>{return (await request<{item:AdminLearnCourse}>(`/api/admin/learn/courses/${id}`)).item;}
export async function adminCreateCourse(input:Record<string,unknown>):Promise<AdminLearnCourse>{return (await authenticatedMutation<{item:AdminLearnCourse}>('/api/admin/learn/courses','POST',input)).item;}
export async function adminUpdateCourse(id:number,input:Record<string,unknown>):Promise<AdminLearnCourse>{return (await authenticatedMutation<{item:AdminLearnCourse}>(`/api/admin/learn/courses/${id}`,'PATCH',input)).item;}
export async function adminDeleteCourse(id:number){return authenticatedMutation(`/api/admin/learn/courses/${id}`,'DELETE');}
export async function adminDuplicateCourse(id:number):Promise<AdminLearnCourse>{return (await authenticatedMutation<{item:AdminLearnCourse}>(`/api/admin/learn/courses/${id}/duplicate`,'POST',{})).item;}
export async function adminPublishCourse(id:number,publishDraftItems=false){return authenticatedMutation<{course:AdminLearnCourse;validation:{valid:boolean;issues:unknown[]}}>(`/api/admin/learn/courses/${id}/publish`,'POST',{publishDraftItems});}
export async function adminValidateCourse(id:number){return (await authenticatedMutation<{validation:{valid:boolean;issues:Array<Record<string,unknown>>}}>(`/api/admin/learn/courses/${id}/validate`,'POST',{})).validation;}
export async function adminGetPrerequisites(id:number){return (await request<{items:Array<{id:number;slug:string;title:string;status:string;required:boolean;passingPercentage:number}>}>(`/api/admin/learn/courses/${id}/prerequisites`)).items;}
export async function adminSetPrerequisites(id:number,items:Array<{id:number;passingPercentage:number}>){return (await authenticatedMutation<{items:Array<{id:number;slug:string;title:string;status:string;required:boolean;passingPercentage:number}>}>(`/api/admin/learn/courses/${id}/prerequisites`,'PUT',{items})).items;}
export async function adminListCourseFiles(id:number):Promise<LearnMedia[]>{return (await request<{items:LearnMedia[]}>(`/api/admin/learn/courses/${id}/files`)).items;}
export async function adminAddCourseFile(id:number,mediaId:number):Promise<LearnMedia[]>{return (await authenticatedMutation<{items:LearnMedia[]}>(`/api/admin/learn/courses/${id}/files`,'POST',{mediaId})).items;}
export async function adminRemoveCourseFile(id:number,mediaId:number):Promise<LearnMedia[]>{return (await authenticatedMutation<{items:LearnMedia[]}>(`/api/admin/learn/courses/${id}/files/${mediaId}`,'DELETE')).items;}
export async function getLearnCourseFiles(slug:string):Promise<LearnMedia[]>{return (await request<{items:LearnMedia[]}>(`/api/learn/courses/${encodeURIComponent(slug)}/files`)).items;}
export async function getLearnCertificate(slug:string):Promise<import('./types').LearnCertificate>{return (await request<{certificate:import('./types').LearnCertificate}>(`/api/learn/courses/${encodeURIComponent(slug)}/certificate`)).certificate;}
export async function adminListCategories(){return (await request<{items:Array<{id:number;slug:string;name:string;description:string;position:number;courseCount:number}>}>('/api/admin/learn/categories')).items;}
export async function adminCreateCategory(input:Record<string,unknown>){return authenticatedMutation('/api/admin/learn/categories','POST',input);}
export async function adminUpdateCategory(id:number,input:Record<string,unknown>){return authenticatedMutation(`/api/admin/learn/categories/${id}`,'PATCH',input);}
export async function adminDeleteCategory(id:number){return authenticatedMutation(`/api/admin/learn/categories/${id}`,'DELETE');}
export async function adminMergeCategory(id:number,targetId:number){return authenticatedMutation(`/api/admin/learn/categories/${id}/merge`,'POST',{targetId});}
export async function adminGetCourseCategories(id:number){return (await request<{items:Array<{id:number;slug:string;name:string}>}>(`/api/admin/learn/courses/${id}/categories`)).items;}
export async function adminSetCourseCategories(id:number,categoryIds:number[]){return (await authenticatedMutation<{items:Array<{id:number;slug:string;name:string}>}>(`/api/admin/learn/courses/${id}/categories`,'PUT',{categoryIds})).items;}
export async function adminCreateSection(courseId:number,input:Record<string,unknown>){return authenticatedMutation(`/api/admin/learn/courses/${courseId}/sections`,'POST',input);}
export async function adminUpdateSection(id:number,input:Record<string,unknown>){return authenticatedMutation(`/api/admin/learn/sections/${id}`,'PATCH',input);}
export async function adminDeleteSection(id:number){return authenticatedMutation(`/api/admin/learn/sections/${id}`,'DELETE');}
export async function adminCreateItem(courseId:number,input:Record<string,unknown>){return authenticatedMutation(`/api/admin/learn/courses/${courseId}/items`,'POST',input);}
export async function adminUpdateItem(id:number,input:Record<string,unknown>){return authenticatedMutation(`/api/admin/learn/items/${id}`,'PATCH',input);}
export async function adminDeleteItem(id:number){return authenticatedMutation(`/api/admin/learn/items/${id}`,'DELETE');}
export async function adminReorderCurriculum(courseId:number,sections:Array<{id:number;items:Array<{id:number}>}>):Promise<AdminLearnCourse>{return (await authenticatedMutation<{item:AdminLearnCourse}>(`/api/admin/learn/courses/${courseId}/curriculum/order`,'PATCH',{sections})).item;}
export async function adminListYouTubePlaylists(courseId:number):Promise<import('./types').YouTubePlaylistLink[]>{return (await request<{items:import('./types').YouTubePlaylistLink[]}>(`/api/admin/learn/courses/${courseId}/youtube-playlists`)).items;}
export async function adminPreviewYouTubePlaylist(courseId:number,sectionId:number,input:{playlist:string;config:Record<string,unknown>}):Promise<import('./types').YouTubePlaylistPreview>{return (await authenticatedMutation<{preview:import('./types').YouTubePlaylistPreview}>(`/api/admin/learn/courses/${courseId}/sections/${sectionId}/youtube-playlist/preview`,'POST',input)).preview;}
export async function adminImportYouTubePlaylist(courseId:number,sectionId:number,input:{playlist:string;config:Record<string,unknown>;selectedVideoIds:string[];allowDuplicates?:boolean}){return (await authenticatedMutation<{result:{playlistLinkId:number;created:Array<{lessonId:number;title:string;videoId:string;position:number}>;skipped:number}}>(`/api/admin/learn/courses/${courseId}/sections/${sectionId}/youtube-playlist/import`,'POST',input)).result;}
export async function adminPreviewYouTubePlaylistSync(playlistLinkId:number){return request<{link:import('./types').YouTubePlaylistLink;sync:import('./types').YouTubePlaylistSync}>(`/api/admin/learn/youtube-playlists/${playlistLinkId}/sync`);}
export async function adminApplyYouTubePlaylistSync(playlistLinkId:number,replaceTitles:boolean){return authenticatedMutation<{link:import('./types').YouTubePlaylistLink;sync:import('./types').YouTubePlaylistSync}>(`/api/admin/learn/youtube-playlists/${playlistLinkId}/sync`,'POST',{replaceTitles});}
export async function adminDisconnectYouTubePlaylist(playlistLinkId:number){return authenticatedMutation(`/api/admin/learn/youtube-playlists/${playlistLinkId}`,'DELETE');}
export async function adminRunLearnCode(input:{projectModeId?:string;language?:string;filename?:string;code:string;stdin?:string}){return (await authenticatedMutation<{result:{status:string;exitCode:number;stdout:string;stderr:string;projectModeId:string;entry:string}}>('/api/admin/learn/runtime/run','POST',input)).result;}
export async function adminGetLesson(id:number):Promise<AdminLearnLesson>{return (await request<{item:AdminLearnLesson}>(`/api/admin/learn/lessons/${id}`)).item;}
export async function adminUpdateLesson(id:number,input:Record<string,unknown>):Promise<AdminLearnLesson>{return (await authenticatedMutation<{item:AdminLearnLesson}>(`/api/admin/learn/lessons/${id}`,'PATCH',input)).item;}
export async function adminListLessonRevisions(id:number){return (await request<{items:Array<{id:number;revisionNumber:number;createdAt:string|null;createdBy:number|null;createdByName:string}>}>(`/api/admin/learn/lessons/${id}/revisions`)).items;}
export async function adminGetLessonRevision(id:number,revisionId:number){return (await request<{item:{id:number;revisionNumber:number;createdAt:string|null;document:import('./types').LessonDocument;settings:Record<string,unknown>}}>(`/api/admin/learn/lessons/${id}/revisions/${revisionId}`)).item;}
export async function adminRestoreLessonRevision(id:number,revisionId:number,expectedVersion:number):Promise<AdminLearnLesson>{return (await authenticatedMutation<{item:AdminLearnLesson}>(`/api/admin/learn/lessons/${id}/revisions/${revisionId}/restore`,'POST',{expectedVersion})).item;}
export async function adminListMedia(input:{page?:number;pageSize?:number;query?:string;type?:string}={}):Promise<LearnMedia[]>{return (await adminListMediaPage(input)).items;}
export async function adminListMediaPage(input:{page?:number;pageSize?:number;query?:string;type?:string}={}):Promise<{items:LearnMedia[];page:number;pageSize:number;total:number}>{const params=new URLSearchParams();if(input.page)params.set('page',String(input.page));if(input.pageSize)params.set('pageSize',String(input.pageSize));if(input.query)params.set('q',input.query);if(input.type)params.set('type',input.type);const payload=await request<{items:LearnMedia[];page:number;pageSize:number;total:number}>(`/api/admin/learn/media${params.size?`?${params}`:''}`);return{items:payload.items,page:payload.page||1,pageSize:payload.pageSize||100,total:payload.total??payload.items.length};}
export async function adminGetMediaUsage(id:number){return (await request<{items:Array<Record<string,unknown>>}>(`/api/admin/learn/media/${id}/usage`)).items;}
export async function adminUploadMedia(kind:'image'|'video'|'caption'|'audio'|'file',file:File):Promise<LearnMedia>{const auth=await getAuthState();if(!auth.authenticated)throw new SaasApiError(401,'authentication_required');const form=new FormData();form.set('file',file);const response=await fetch(`/api/admin/learn/media/${kind}`,{method:'POST',credentials:'same-origin',headers:{Accept:'application/json','x-learnitive-csrf':auth.csrfToken},body:form});const payload=await response.json() as {item?:LearnMedia;error?:string};if(!response.ok||!payload.item)throw new SaasApiError(response.status,payload.error||'learn_media_upload_failed');return payload.item;}
export async function adminUploadMediaWithProgress(kind:'image'|'video'|'caption'|'audio'|'file',file:File,onProgress:(progress:{loaded:number;total:number;percent:number})=>void,signal?:AbortSignal):Promise<LearnMedia>{const auth=await getAuthState();if(!auth.authenticated)throw new SaasApiError(401,'authentication_required');return new Promise((resolve,reject)=>{const xhr=new XMLHttpRequest();const form=new FormData();form.set('file',file);xhr.open('POST',`/api/admin/learn/media/${kind}`);xhr.withCredentials=true;xhr.setRequestHeader('Accept','application/json');xhr.setRequestHeader('x-learnitive-csrf',auth.csrfToken);xhr.upload.addEventListener('progress',event=>{const total=event.lengthComputable?event.total:file.size;const loaded=Math.min(event.loaded,total||event.loaded);onProgress({loaded,total,percent:total>0?Math.min(100,Math.round(loaded/total*100)):0})});xhr.addEventListener('load',()=>{let payload:{item?:LearnMedia;error?:string}={};try{payload=JSON.parse(xhr.responseText||'{}') as typeof payload}catch{/* handled below */}if(xhr.status>=200&&xhr.status<300&&payload.item){onProgress({loaded:file.size,total:file.size,percent:100});resolve(payload.item);return}reject(new SaasApiError(xhr.status||500,payload.error||'learn_media_upload_failed'))});xhr.addEventListener('error',()=>reject(new SaasApiError(xhr.status||0,'learn_media_upload_network_error')));xhr.addEventListener('abort',()=>reject(new SaasApiError(0,'learn_media_upload_cancelled')));if(signal){if(signal.aborted){xhr.abort();return}signal.addEventListener('abort',()=>xhr.abort(),{once:true})}xhr.send(form)});}
export async function adminDeleteMedia(id:number){return authenticatedMutation(`/api/admin/learn/media/${id}`,'DELETE');}
export async function adminCreateFaq(courseId:number,input:Record<string,unknown>){return authenticatedMutation(`/api/admin/learn/courses/${courseId}/faqs`,'POST',input);}
export async function adminUpdateFaq(id:number,input:Record<string,unknown>){return authenticatedMutation(`/api/admin/learn/faqs/${id}`,'PATCH',input);}
export async function adminDeleteFaq(id:number){return authenticatedMutation(`/api/admin/learn/faqs/${id}`,'DELETE');}

export async function adminGetQuiz(id:number){return (await request<{item:import('./types').AdminLearnQuiz}>(`/api/admin/learn/quizzes/${id}`)).item;}
export async function adminUpdateQuiz(id:number,input:Record<string,unknown>){return (await authenticatedMutation<{item:import('./types').AdminLearnQuiz}>(`/api/admin/learn/quizzes/${id}`,'PATCH',input)).item;}
export async function adminCreateQuestion(quizId:number,input:Record<string,unknown>){return authenticatedMutation(`/api/admin/learn/quizzes/${quizId}/questions`,'POST',input);}
export async function adminUpdateQuestion(id:number,input:Record<string,unknown>){return authenticatedMutation(`/api/admin/learn/questions/${id}`,'PATCH',input);}
export async function adminDeleteQuestion(id:number){return authenticatedMutation(`/api/admin/learn/questions/${id}`,'DELETE');}
export async function getLearnQuiz(course:string,quiz:string){return (await request<{quiz:import('./types').PublicLearnQuiz}>(`/api/learn/courses/${encodeURIComponent(course)}/quizzes/${encodeURIComponent(quiz)}`)).quiz;}
export async function startLearnQuizAttempt(course:string,quiz:string){return (await authenticatedMutation<{attempt:{id:number;attemptNumber:number;startedAt:string;expiresAt:string|null;timeLimitSeconds:number|null;questions?:import('./types').PublicLearnQuiz['questions']}}>(`/api/learn/courses/${encodeURIComponent(course)}/quizzes/${encodeURIComponent(quiz)}/attempts/start`,'POST',{})).attempt;}
export async function submitLearnQuiz(course:string,quiz:string,answers:Record<string,unknown>,attemptId?:number){return (await authenticatedMutation<{result:{attemptId:number;attemptNumber:number;scorePercentage:number;passed:boolean;feedback:Array<Record<string,unknown>>}}>(`/api/learn/courses/${encodeURIComponent(course)}/quizzes/${encodeURIComponent(quiz)}/submit`,'POST',{answers,attemptId})).result;}
export async function adminGetAssignment(id:number){return (await request<{item:import('./types').AdminLearnAssignment}>(`/api/admin/learn/assignments/${id}`)).item;}
export async function adminUpdateAssignment(id:number,input:Record<string,unknown>){return (await authenticatedMutation<{item:import('./types').AdminLearnAssignment}>(`/api/admin/learn/assignments/${id}`,'PATCH',input)).item;}
export async function getLearnAssignment(course:string,assignment:string){return (await request<{assignment:import('./types').PublicLearnAssignment}>(`/api/learn/courses/${encodeURIComponent(course)}/assignments/${encodeURIComponent(assignment)}`)).assignment;}
export async function submitLearnAssignment(course:string,assignment:string,input:Record<string,unknown>){return (await authenticatedMutation<{submission:import('./types').LearnAssignmentSubmission}>(`/api/learn/courses/${encodeURIComponent(course)}/assignments/${encodeURIComponent(assignment)}/submit`,'POST',input)).submission;}
export async function uploadLearnAssignmentFile(course:string,assignment:string,file:File,onProgress:(value:{loaded:number;total:number;percent:number})=>void,signal?:AbortSignal):Promise<LearnMedia>{const auth=await getAuthState();if(!auth.authenticated)throw new SaasApiError(401,'authentication_required');return new Promise((resolve,reject)=>{const xhr=new XMLHttpRequest(),form=new FormData();form.set('file',file);xhr.open('POST',`/api/learn/courses/${encodeURIComponent(course)}/assignments/${encodeURIComponent(assignment)}/upload`);xhr.withCredentials=true;xhr.setRequestHeader('Accept','application/json');xhr.setRequestHeader('x-learnitive-csrf',auth.csrfToken);xhr.upload.onprogress=event=>{const total=event.lengthComputable?event.total:file.size,loaded=Math.min(event.loaded,total||event.loaded);onProgress({loaded,total,percent:total?Math.min(100,Math.round(loaded/total*100)):0})};xhr.onload=()=>{let payload:{item?:LearnMedia;error?:string}={};try{payload=JSON.parse(xhr.responseText||'{}')}catch{}if(xhr.status>=200&&xhr.status<300&&payload.item){onProgress({loaded:file.size,total:file.size,percent:100});resolve(payload.item)}else reject(new SaasApiError(xhr.status||500,payload.error||'learn_assignment_upload_failed'))};xhr.onerror=()=>reject(new SaasApiError(xhr.status||0,'learn_assignment_upload_network_error'));xhr.onabort=()=>reject(new SaasApiError(0,'learn_assignment_upload_cancelled'));if(signal){if(signal.aborted){xhr.abort();return}signal.addEventListener('abort',()=>xhr.abort(),{once:true})}xhr.send(form)});}
export async function adminListAssignmentSubmissions(id:number,input:{status?:string;page?:number;pageSize?:number}={}){const params=new URLSearchParams();if(input.status)params.set('status',input.status);if(input.page)params.set('page',String(input.page));if(input.pageSize)params.set('pageSize',String(input.pageSize));return request<{assignmentId:number;items:import('./types').LearnAssignmentSubmission[];page:number;pageSize:number;total:number}>(`/api/admin/learn/assignments/${id}/submissions${params.size?`?${params}`:''}`);}
export async function adminReviewAssignmentSubmission(id:number,status:'accepted'|'rejected',feedback:string){return (await authenticatedMutation<{item:import('./types').LearnAssignmentSubmission}>(`/api/admin/learn/assignment-submissions/${id}/review`,'POST',{status,feedback})).item;}
export async function adminUpdateCourseMain(id:number,course:Record<string,unknown>,categoryIds:number[]){return (await authenticatedMutation<{course:AdminLearnCourse}>(`/api/admin/learn/courses/${id}/main-settings`,'PATCH',{course,categoryIds})).course;}
export async function adminUpdateDrip(id:number,items:Array<{id:number;availableAt?:string|null;dripDaysAfterEnrollment?:number|null}>){return (await authenticatedMutation<{item:AdminLearnCourse}>(`/api/admin/learn/courses/${id}/drip`,'PATCH',{items})).item;}

export async function adminListLearnImports():Promise<LearnImportBatch[]>{return (await request<{items:LearnImportBatch[]}>('/api/admin/learn/import')).items;}
export async function adminUploadLearnImport(file:File):Promise<LearnImportAnalysis>{const auth=await getAuthState();if(!auth.authenticated)throw new SaasApiError(401,'authentication_required');const response=await fetch('/api/admin/learn/import/upload',{method:'POST',credentials:'same-origin',headers:{Accept:'application/json','Content-Type':'application/zip','x-learnitive-csrf':auth.csrfToken},body:file});const payload=await response.json() as (LearnImportAnalysis&{error?:string});if(!response.ok||!payload.batch)throw new SaasApiError(response.status,payload.error||'learn_import_upload_failed');return payload;}
export async function adminExecuteLearnImport(batchId:number,input:{mode:'skip'|'update'|'copy';courseSourceIds:Array<number|string>;courseStatus:'draft'|'published'}):Promise<LearnImportSummary>{return (await authenticatedMutation<{result:LearnImportSummary}>(`/api/admin/learn/import/${batchId}/execute`,'POST',input)).result;}
export async function adminDiscardLearnImport(batchId:number){return authenticatedMutation(`/api/admin/learn/import/${batchId}`,'DELETE');}

