import apiClient from './client';
import type {
  AdminUser,
  CreateUserRequest,
  UpdateUserRequest,
  AdminMasterAudio,
  AppSettings,
  ApiResponse,
  PaginatedResponse,
  QueryParams,
  Chapter,
  Verse,
  Badge,
  TeacherResponse,
  StudentResponse,
  StudentDetailResponse,
  ClassResponse,
  ClassDetailResponse,
  ClassStudentsPaginatedResponse,
} from '@/types';

export const adminApi = {
  // Users
  getUsers: async (params?: QueryParams) => {
    const response = await apiClient.get<ApiResponse<PaginatedResponse<AdminUser>>>(
      '/admin/users',
      { params }
    );
    return response.data.data;
  },

  getTeachers: async (params?: QueryParams) => {
    const response = await apiClient.get<PaginatedResponse<TeacherResponse>>(
      '/users/teachers',
      { params }
    );
    return response.data;
  },

  getStudents: async (params?: QueryParams) => {
    const response = await apiClient.get<PaginatedResponse<StudentResponse>>(
      '/users/students',
      { params }
    );
    return response.data;
  },

  getStudentById: async (id: string) => {
    const response = await apiClient.get<ApiResponse<StudentDetailResponse>>(`/users/students/${id}`);
    return response.data.data;
  },

  getClasses: async (params?: QueryParams) => {
    const response = await apiClient.get<ApiResponse<ClassResponse[]>>(
      '/classes',
      { params }
    );
    return response.data;
  },

  getClassById: async (id: string) => {
    const response = await apiClient.get<ApiResponse<ClassDetailResponse>>(`/classes/${id}`);
    return response.data.data;
  },

  getClassStudents: async (classId: string, params?: QueryParams) => {
    const response = await apiClient.get<ClassStudentsPaginatedResponse>(
      `/classes/${classId}/students`,
      { params }
    );
    return response.data;
  },

  createClass: async (data: { name: string }) => {
    const response = await apiClient.post<ApiResponse<ClassResponse>>('/classes', data);
    return response.data.data;
  },

  addStudentToClass: async (classId: string, studentId: string) => {
    const response = await apiClient.post<ApiResponse<null>>(`/classes/${classId}/students`, { studentId });
    return response.data;
  },

  assignStudentsToClass: async (classId: string, studentIds: string[]) => {
    const response = await apiClient.post<ApiResponse<null>>(`/classes/${classId}/assign-student`, { studentIds });
    return response.data;
  },

  removeStudentFromClass: async (classId: string, studentId: string) => {
    const response = await apiClient.delete<ApiResponse<null>>(`/classes/${classId}/students/${studentId}`);
    return response.data;
  },

  addTeacherToClass: async (classId: string, teacherId: string) => {
    const response = await apiClient.post<ApiResponse<null>>(`/classes/${classId}/teachers`, { teacherId });
    return response.data;
  },

  assignTeachersToClass: async (classId: string, teacherIds: string[]) => {
    const response = await apiClient.post<ApiResponse<null>>(`/classes/${classId}/assign-teacher`, { teacherIds });
    return response.data;
  },

  removeTeacherFromClass: async (classId: string, teacherId: string) => {
    const response = await apiClient.delete<ApiResponse<null>>(`/classes/${classId}/teachers/${teacherId}`);
    return response.data;
  },

  assignTeacher: async (studentId: string, teacherId: string) => {
    const response = await apiClient.post<ApiResponse<null>>(`/users/students/${studentId}/assign-teacher`, { teacherId });
    return response.data;
  },

  getUser: async (id: string) => {
    const response = await apiClient.get<ApiResponse<AdminUser>>(`/admin/users/${id}`);
    return response.data.data;
  },

  createUser: async (data: CreateUserRequest) => {
    const response = await apiClient.post<ApiResponse<AdminUser>>('/admin/users', data);
    return response.data.data;
  },

  updateUser: async (id: string, data: UpdateUserRequest) => {
    const response = await apiClient.put<ApiResponse<AdminUser>>(`/admin/users/${id}`, data);
    return response.data.data;
  },

  deleteUser: async (id: string) => {
    const response = await apiClient.delete<ApiResponse<null>>(`/admin/users/${id}`);
    return response.data;
  },

  bulkDeleteUsers: async (ids: string[]) => {
    const response = await apiClient.post<ApiResponse<null>>('/admin/users/bulk-delete', { ids });
    return response.data;
  },

  // Chapters
  getChapters: async (params?: QueryParams) => {
    const response = await apiClient.get<ApiResponse<PaginatedResponse<Chapter>>>(
      '/admin/chapters',
      { params }
    );
    return response.data.data;
  },

  createChapter: async (data: Partial<Chapter>) => {
    const response = await apiClient.post<ApiResponse<Chapter>>('/admin/chapters', data);
    return response.data.data;
  },

  updateChapter: async (id: string, data: Partial<Chapter>) => {
    const response = await apiClient.put<ApiResponse<Chapter>>(`/admin/chapters/${id}`, data);
    return response.data.data;
  },

  deleteChapter: async (id: string) => {
    const response = await apiClient.delete<ApiResponse<null>>(`/admin/chapters/${id}`);
    return response.data;
  },

  // Verses
  getVerses: async (params?: QueryParams) => {
    const response = await apiClient.get<ApiResponse<PaginatedResponse<Verse>>>(
      '/admin/verses',
      { params }
    );
    return response.data.data;
  },

  createVerse: async (data: Partial<Verse>) => {
    const response = await apiClient.post<ApiResponse<Verse>>('/admin/verses', data);
    return response.data.data;
  },

  updateVerse: async (id: string, data: Partial<Verse>) => {
    const response = await apiClient.put<ApiResponse<Verse>>(`/admin/verses/${id}`, data);
    return response.data.data;
  },

  deleteVerse: async (id: string) => {
    const response = await apiClient.delete<ApiResponse<null>>(`/admin/verses/${id}`);
    return response.data;
  },

  // Master Audio
  getAudioList: async (params?: QueryParams) => {
    const response = await apiClient.get<ApiResponse<PaginatedResponse<AdminMasterAudio>>>(
      '/admin/audio',
      { params }
    );
    return response.data.data;
  },

  uploadAudio: async (verseId: string, audio: File) => {
    const formData = new FormData();
    formData.append('verseId', verseId);
    formData.append('audio', audio);
    const response = await apiClient.post<ApiResponse<AdminMasterAudio>>('/admin/audio', formData, {
      headers: { 'Content-Type': 'multipart/form-data' },
    });
    return response.data.data;
  },

  deleteAudio: async (id: string) => {
    const response = await apiClient.delete<ApiResponse<null>>(`/admin/audio/${id}`);
    return response.data;
  },

  // Badges
  getBadges: async (params?: QueryParams) => {
    const response = await apiClient.get<ApiResponse<PaginatedResponse<Badge>>>(
      '/admin/badges',
      { params }
    );
    return response.data.data;
  },

  createBadge: async (data: Partial<Badge>) => {
    const response = await apiClient.post<ApiResponse<Badge>>('/admin/badges', data);
    return response.data.data;
  },

  updateBadge: async (id: string, data: Partial<Badge>) => {
    const response = await apiClient.put<ApiResponse<Badge>>(`/admin/badges/${id}`, data);
    return response.data.data;
  },

  deleteBadge: async (id: string) => {
    const response = await apiClient.delete<ApiResponse<null>>(`/admin/badges/${id}`);
    return response.data;
  },

  // Settings
  getSettings: async () => {
    const response = await apiClient.get<ApiResponse<AppSettings>>('/admin/settings');
    return response.data.data;
  },

  updateSettings: async (data: Partial<AppSettings>) => {
    const response = await apiClient.put<ApiResponse<AppSettings>>('/admin/settings', data);
    return response.data.data;
  },
};
