import { getApiBaseUrl } from '$lib/api';
import { authenticatedFetch } from '$lib/auth';

export interface StudentGrade {
	id: string;
	evaluationId: string;
	evaluationTitle: string;
	evaluationDate: string;
	gradeScale: number;
	coefficient: number;
	subjectId: string;
	subjectName: string | null;
	value: number | null;
	status: string;
	appreciation: string | null;
	publishedAt: string | null;
	classAverage: number | null;
	classMin: number | null;
	classMax: number | null;
}

export interface SubjectAverage {
	subjectId: string;
	subjectName: string | null;
	average: number;
	gradeCount: number;
}

export interface StudentAverages {
	studentId: string;
	periodId: string | null;
	subjectAverages: SubjectAverage[];
	generalAverage: number | null;
}

/**
 * Récupère toutes les notes publiées de l'élève connecté.
 */
export async function fetchMyGrades(): Promise<StudentGrade[]> {
	const apiUrl = getApiBaseUrl();
	const response = await authenticatedFetch(`${apiUrl}/me/grades`);

	if (!response.ok) {
		throw new Error(`Erreur lors du chargement des notes (${response.status})`);
	}

	const json = await response.json();
	// API Platform returns hydra:member or raw array
	return json['hydra:member'] ?? json.member ?? json;
}

/**
 * Récupère les notes de l'élève pour une matière.
 */
export async function fetchMyGradesBySubject(subjectId: string): Promise<StudentGrade[]> {
	const apiUrl = getApiBaseUrl();
	const response = await authenticatedFetch(
		`${apiUrl}/me/grades/subject/${encodeURIComponent(subjectId)}`
	);

	if (!response.ok) {
		throw new Error(`Erreur lors du chargement des notes (${response.status})`);
	}

	const json = await response.json();
	return json['hydra:member'] ?? json.member ?? json;
}

/**
 * Récupère les moyennes de l'élève connecté.
 */
export async function fetchMyAverages(periodId?: string): Promise<StudentAverages> {
	const apiUrl = getApiBaseUrl();
	const params = periodId ? `?periodId=${encodeURIComponent(periodId)}` : '';
	const response = await authenticatedFetch(`${apiUrl}/me/averages${params}`);

	if (!response.ok) {
		throw new Error(`Erreur lors du chargement des moyennes (${response.status})`);
	}

	return response.json();
}
