import { getMyRoles, switchRole as apiSwitchRole, type RoleInfo } from './api/roles';

/**
 * Contexte de rôle réactif.
 *
 * Gère le rôle actif de l'utilisateur lorsqu'il possède plusieurs rôles (FR5).
 * Le rôle actif détermine quelle vue (dashboard, navigation) est affichée.
 *
 * @see Story 2.6 - Attribution des rôles
 */

// État réactif
let roles = $state<RoleInfo[]>([]);
let activeRole = $state<string | null>(null);
let activeRoleLabel = $state<string | null>(null);
let isLoading = $state(false);
let isSwitching = $state(false);
let isFetched = $state(false);

/**
 * Charge les rôles de l'utilisateur courant depuis l'API.
 * Protégé contre les appels multiples (guard isFetched).
 */
export async function fetchRoles(): Promise<void> {
	if (isFetched || isLoading) return;

	isLoading = true;
	try {
		const data = await getMyRoles();
		roles = data.roles;
		activeRole = data.activeRole;
		activeRoleLabel = data.activeRoleLabel;
		isFetched = true;
	} catch (error) {
		console.error('[roleContext] Failed to fetch roles:', error);
	} finally {
		isLoading = false;
	}
}

/**
 * Bascule vers un autre rôle.
 */
export async function switchTo(role: string): Promise<boolean> {
	if (role === activeRole) return true;

	isSwitching = true;
	try {
		const data = await apiSwitchRole(role);
		activeRole = data.activeRole;
		activeRoleLabel = data.activeRoleLabel;
		return true;
	} catch (error) {
		console.error('[roleContext] Failed to switch role:', error);
		return false;
	} finally {
		isSwitching = false;
	}
}

/**
 * Indique si l'utilisateur a plusieurs rôles (et donc peut basculer).
 */
export function hasMultipleRoles(): boolean {
	return roles.length > 1;
}

/**
 * Retourne les rôles disponibles.
 */
export function getRoles(): RoleInfo[] {
	return roles;
}

/**
 * Retourne le rôle actif.
 */
export function getActiveRole(): string | null {
	return activeRole;
}

/**
 * Retourne le libellé du rôle actif.
 */
export function getActiveRoleLabel(): string | null {
	return activeRoleLabel;
}

/**
 * Indique si le chargement initial est en cours.
 */
export function getIsLoading(): boolean {
	return isLoading;
}

/**
 * Indique si un basculement de rôle est en cours.
 */
export function getIsSwitching(): boolean {
	return isSwitching;
}

/**
 * Réinitialise l'état (à appeler au logout).
 */
export function resetRoleContext(): void {
	roles = [];
	activeRole = null;
	activeRoleLabel = null;
	isFetched = false;
}
