import { api } from "@/lib/api-client";
import type {
  Assignment,
  AssignmentState,
  AssignmentCreateRequest,
  ExamSchedule,
  ExamScheduleCreateRequest,
  ScheduleState,
  StudentExamAssignment,
  PaginatedResponse,
  PaginationParams,
  ApiSuccessResponse,
} from "@/types";

export interface AssignmentListParams extends PaginationParams {
  state?: AssignmentState;
  entity_id?: number;
}

export interface ScheduleListParams extends PaginationParams {
  state?: ScheduleState;
}

export const assignmentsService = {
  async list(params?: AssignmentListParams): Promise<PaginatedResponse<Assignment>> {
    return api.get<PaginatedResponse<Assignment>>("/assignments", params as Record<string, string | number | boolean | undefined>);
  },

  async getById(id: number): Promise<Assignment> {
    return api.get<Assignment>(`/assignments/${id}`);
  },

  async create(data: AssignmentCreateRequest): Promise<Assignment> {
    return api.post<Assignment>("/assignments", data);
  },

  async update(id: number, data: Partial<AssignmentCreateRequest>): Promise<Assignment> {
    return api.patch<Assignment>(`/assignments/${id}`, data);
  },

  async delete(id: number): Promise<ApiSuccessResponse> {
    return api.delete<ApiSuccessResponse>(`/assignments/${id}`);
  },

  async archive(id: number): Promise<Assignment> {
    return api.post<Assignment>(`/assignments/${id}/archive`);
  },

  async start(id: number): Promise<Assignment> {
    return api.post<Assignment>(`/assignments/${id}/start`);
  },

  async listSchedules(params?: ScheduleListParams): Promise<PaginatedResponse<ExamSchedule>> {
    return api.get<PaginatedResponse<ExamSchedule>>("/exam-schedules", params as Record<string, string | number | boolean | undefined>);
  },

  async createSchedule(data: ExamScheduleCreateRequest): Promise<ExamSchedule> {
    return api.post<ExamSchedule>("/exam-schedules", data);
  },

  async updateSchedule(id: number, data: Partial<ExamScheduleCreateRequest & { state: ScheduleState }>): Promise<ExamSchedule> {
    return api.put<ExamSchedule>(`/exam-schedules/${id}`, data);
  },

  async deleteSchedule(id: number): Promise<ApiSuccessResponse> {
    return api.delete<ApiSuccessResponse>(`/exam-schedules/${id}`);
  },

  async archiveSchedule(id: number): Promise<ExamSchedule> {
    return api.post<ExamSchedule>(`/exam-schedules/${id}/archive`);
  },

  async getStudentExams(): Promise<{ items: StudentExamAssignment[] }> {
    return api.get<{ items: StudentExamAssignment[] }>("/student/my-exams");
  },
};
