import { api } from "@/lib/api-client"; import { asPaginated, asRecordData } from "@/lib/odoo-api"; import type { Classroom, ClassroomAssignCourseRequest, ClassroomBatchSummary, ClassroomCourse, ClassroomCreateRequest, ClassroomMember, ClassroomSection, ClassroomStudent, PaginatedResponse, PaginationParams, ApiSuccessResponse, } from "@/types"; export interface ClassroomListParams extends PaginationParams { entity_id?: number; branch_id?: number; search?: string; active?: boolean; } export const classroomsService = { async list(params?: ClassroomListParams): Promise> { const raw = await api.get( "/classrooms", params as Record, ); return asPaginated(raw); }, async getById(id: number): Promise { const raw = await api.get(`/classrooms/${id}`); return asRecordData(raw); }, async create(data: ClassroomCreateRequest): Promise { const raw = await api.post("/classrooms", data); return asRecordData(raw); }, async update(id: number, data: Partial): Promise { const raw = await api.patch(`/classrooms/${id}`, data); return asRecordData(raw); }, async delete(id: number): Promise { return api.delete(`/classrooms/${id}`); }, // ---- Roster ---------------------------------------------------------- async listStudents(id: number): Promise<{ items: ClassroomStudent[]; total: number }> { return api.get(`/classrooms/${id}/students`); }, /** Replace or add to roster. ``mode='set'`` overwrites; ``mode='add'`` appends. */ async setStudents( id: number, studentIds: number[], mode: "set" | "add" = "set", ): Promise { const raw = await api.post(`/classrooms/${id}/students`, { student_ids: studentIds, mode, }); return asRecordData(raw); }, async removeStudents(id: number, studentIds: number[]): Promise { const raw = await api.delete(`/classrooms/${id}/students`, { student_ids: studentIds, }); return asRecordData(raw); }, // ---- Homeroom teachers ---------------------------------------------- async listTeachers(id: number): Promise<{ items: ClassroomMember[]; total: number }> { return api.get(`/classrooms/${id}/teachers`); }, async setTeachers( id: number, teacherIds: number[], mode: "set" | "add" = "set", ): Promise { const raw = await api.post(`/classrooms/${id}/teachers`, { teacher_ids: teacherIds, mode, }); return asRecordData(raw); }, // ---- Courses + cascade ---------------------------------------------- async listCourses(id: number): Promise<{ items: ClassroomCourse[]; total: number }> { return api.get(`/classrooms/${id}/courses`); }, async listSections( id: number, params?: { course_id?: number; active?: boolean }, ): Promise<{ items: ClassroomSection[]; total: number }> { return api.get( `/classrooms/${id}/sections`, params as Record, ); }, /** Assign a course → server creates (or reuses) the canonical batch and * enrolls every classroom student into it. */ async assignCourse( id: number, payload: ClassroomAssignCourseRequest, ): Promise<{ data: Classroom; batch: ClassroomBatchSummary }> { return api.post(`/classrooms/${id}/assign-course`, payload); }, async detachCourse(id: number, courseId: number): Promise { const raw = await api.delete(`/classrooms/${id}/courses/${courseId}`); return asRecordData(raw); }, // ---- Batches -------------------------------------------------------- async listBatches(id: number): Promise<{ items: ClassroomBatchSummary[]; total: number }> { return api.get(`/classrooms/${id}/batches`); }, };