/**
 * Dashboard Server Registry — API générique
 *
 * Les features s'enregistrent ici via registerServerWidget().
 * Ce fichier ne doit jamais importer une feature directement.
 * Les features dépendent de ce fichier, pas l'inverse.
 */

const widgets = new Map(); // id → fetcher

/**
 * Enregistre une fonction de fetch pour le tableau de bord.
 * Appelé en side effect par chaque feature (ex: auth/dashboard.server.js).
 * @param {string} id - Identifiant unique de la feature
 * @param {() => Promise<any>} fetcher - Fonction async retournant des données sérialisables
 */
export function registerServerWidget(id, fetcher) {
  widgets.set(id, fetcher);
}

/**
 * Exécute tous les fetchers enregistrés en parallèle.
 * Un fetcher qui échoue n'empêche pas les autres (Promise.allSettled).
 * @returns {Promise<Record<string, any>>} Map featureId → données
 */
export async function collectAllDashboardData() {
  const results = await Promise.allSettled(
    Array.from(widgets.entries()).map(([id, fetcher]) =>
      fetcher().then(data => ({ id, data }))
    )
  );

  return results.reduce((acc, result) => {
    if (result.status === 'fulfilled') {
      acc[result.value.id] = result.value.data;
    }
    return acc;
  }, {});
}
