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

/**
 * Types pour la gestion des rôles utilisateur.
 *
 * @see Story 2.6 - Attribution des rôles
 */
export interface RoleInfo {
	value: string;
	label: string;
}

export interface MyRolesResponse {
	roles: RoleInfo[];
	activeRole: string;
	activeRoleLabel: string;
}

export interface SwitchRoleResponse {
	activeRole: string;
	activeRoleLabel: string;
}

/**
 * Récupère les rôles de l'utilisateur courant et le rôle actif.
 */
export async function getMyRoles(): Promise<MyRolesResponse> {
	const apiUrl = getApiBaseUrl();
	const response = await authenticatedFetch(`${apiUrl}/me/roles`);

	if (!response.ok) {
		throw new Error('Failed to fetch roles');
	}

	return await response.json();
}

/**
 * Bascule le contexte vers un autre rôle.
 */
export async function switchRole(role: string): Promise<SwitchRoleResponse> {
	const apiUrl = getApiBaseUrl();
	const response = await authenticatedFetch(`${apiUrl}/me/switch-role`, {
		method: 'POST',
		headers: {
			'Content-Type': 'application/json'
		},
		body: JSON.stringify({ role })
	});

	if (!response.ok) {
		throw new Error('Failed to switch role');
	}

	return await response.json();
}

/**
 * Met à jour les rôles d'un utilisateur (admin uniquement).
 */
export async function updateUserRoles(userId: string, roles: string[]): Promise<void> {
	const apiUrl = getApiBaseUrl();
	const response = await authenticatedFetch(`${apiUrl}/users/${userId}/roles`, {
		method: 'PUT',
		headers: {
			'Content-Type': 'application/json'
		},
		body: JSON.stringify({ roles })
	});

	if (!response.ok) {
		let errorMessage = `Erreur lors de la mise à jour des rôles (${response.status})`;
		try {
			const errorData = await response.json();
			if (errorData['hydra:description']) {
				errorMessage = errorData['hydra:description'];
			} else if (errorData.detail) {
				errorMessage = errorData.detail;
			}
		} catch {
			// JSON parsing failed, keep default message
		}
		throw new Error(errorMessage);
	}
}
