import apiClient from './client';
import type {
  Submission,
  CreateSubmissionRequest,
  SubmissionResult,
  ApiResponse,
  PaginatedResponse,
  QueryParams,
} from '@/types';

const MOCK_FEEDBACK_POOL = [
  'Bacaan sudah baik. Perhatikan makharijul huruf pada huruf ق dan خ.',
  'Kelancaran meningkat! Coba lebih perhatikan panjang pendek harakat (mad).',
  'Pelafalan cukup jelas. Latih lagi tajwid idgham bighunnah.',
  'Hafalan cukup kuat, jaga konsistensi tempo saat membaca.',
];

function randomInRange(min: number, max: number) {
  return Math.floor(Math.random() * (max - min + 1)) + min;
}

export const submissionApi = {
  createSubmission: async (data: CreateSubmissionRequest) => {
    const formData = new FormData();
    formData.append('audio', data.audio);
    formData.append('durationSeconds', data.durationSeconds.toString());

    const response = await apiClient.post<ApiResponse<Submission>>(`/submissions/verse/${data.verseId}`, formData, {
      headers: { 'Content-Type': 'multipart/form-data' },
      onUploadProgress: (progressEvent) => {
        const progress = progressEvent.total
          ? Math.round((progressEvent.loaded * 100) / progressEvent.total)
          : 0;
        // Emit progress event for UI updates
        window.dispatchEvent(
          new CustomEvent('upload-progress', { detail: { progress } })
        );
      },
    });
    return response.data.data;
  },

  getMySubmissions: async (params?: QueryParams) => {
    const response = await apiClient.get<ApiResponse<Submission[]>>(
      '/submissions/my-submissions',
      { params }
    );
    return response.data.data;
  },

  getMySubmissionsByVerse: async (verseId: string, params?: QueryParams) => {
    const response = await apiClient.get<ApiResponse<Submission[]>>(
      `/submissions/my-submissions/verse/${verseId}`,
      { params }
    );
    return response.data.data;
  },

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

  getSubmissionResult: async (id: string) => {
    const response = await apiClient.get<ApiResponse<SubmissionResult>>(
      `/submissions/${id}/result`
    );
    return response.data.data;
  },

  retrySubmission: async (id: string) => {
    const response = await apiClient.post<ApiResponse<Submission>>(
      `/submissions/${id}/retry`
    );
    return response.data.data;
  },

  // TODO(BE): dummy AI-grading result until the real endpoint is ready.
  // Simulates processing time + randomized scores so the "latihan" flow has
  // an immediate result to show. Swap for `getSubmissionResult` once the
  // backend generates real AI scores synchronously after upload.
  generateMockResult: async (submissionId: string, verseId: string): Promise<SubmissionResult> => {
    await new Promise((resolve) => setTimeout(resolve, 1800));

    const similarity = randomInRange(70, 98);
    const fluency = randomInRange(65, 97);
    const pronunciation = randomInRange(68, 96);
    const overall = Math.round((similarity + fluency + pronunciation) / 3);

    return {
      submission: {
        id: submissionId,
        studentId: '',
        verseId,
        audioUrl: '',
        status: 'approved',
        scores: { overall, similarity, fluency, pronunciation },
        aiScore: overall,
        createdAt: new Date().toISOString(),
      },
      scores: { overall, similarity, fluency, pronunciation },
      feedback: MOCK_FEEDBACK_POOL[randomInRange(0, MOCK_FEEDBACK_POOL.length - 1)],
      isNewRecord: overall >= 90,
    };
  },
};
