/**
 * API Runtime State
 *
 * Centralise tout l'état global persisté de l'infrastructure API :
 *   - Le resolver de session (injecté par la feature auth via configureRouter)
 *   - Le registre des routes de features (peuplé via registerFeatureRoutes)
 *
 * Les deux utilisent le même pattern Symbol.for() + globalThis pour survivre
 * aux hot-reloads Next.js sans réinitialiser l'état entre les recharges de modules.
 *
 * LIMITATION CONNUE : l'état est local au process. Dans un déploiement multi-worker
 * ou serverless, chaque instance maintient son propre état. Pour les routes, cela
 * implique que initializeZen() doit être appelé une fois par worker — ce qui est
 * déjà le cas via instrumentation.js.
 */

// ---------------------------------------------------------------------------
// Session resolver
// ---------------------------------------------------------------------------

const RESOLVER_KEY = Symbol.for('__ZEN_SESSION_RESOLVER__');

/**
 * Configure le router avec les dépendances de la feature auth.
 * Doit être appelé une fois au démarrage avant toute requête.
 *
 * @param {{ resolveSession: (token: string) => Promise<Object|null> }} config
 */
export function configureRouter({ resolveSession }) {
  if (typeof resolveSession !== 'function') {
    throw new TypeError('configureRouter: resolveSession must be a function');
  }
  globalThis[RESOLVER_KEY] = resolveSession;
}

/**
 * Retourne le resolver de session configuré.
 * Utilisé par router.js et core/storage/api.js.
 *
 * @returns {(token: string) => Promise<Object|null>}
 * @throws {Error} Si configureRouter n'a pas encore été appelé
 */
export function getSessionResolver() {
  const resolver = globalThis[RESOLVER_KEY];
  if (!resolver) {
    throw new Error(
      'Router not configured: call configureRouter({ resolveSession }) during initializeZen() before handling requests.'
    );
  }
  return resolver;
}

/**
 * Efface le resolver injecté.
 * Destiné aux tests ou à la réinitialisation manuelle.
 */
export function clearRouterConfig() {
  globalThis[RESOLVER_KEY] = undefined;
}

// ---------------------------------------------------------------------------
// Feature routes registry
// ---------------------------------------------------------------------------

const REGISTRY_KEY = Symbol.for('__ZEN_FEATURE_ROUTES__');
if (!globalThis[REGISTRY_KEY]) globalThis[REGISTRY_KEY] = [];
/** @type {Array} */
const _featureRoutes = globalThis[REGISTRY_KEY];

/**
 * Enregistre des routes API.
 * Appelé une fois par feature core ou module externe pendant initializeZen()
 * ou depuis le hook register() d'un module.
 *
 * @param {ReadonlyArray} routes - Définitions produites par defineApiRoutes()
 */
export function registerApiRoutes(routes) {
  if (!Array.isArray(routes)) {
    throw new TypeError('registerApiRoutes: routes must be an array');
  }
  _featureRoutes.push(...routes);
}

/**
 * Alias rétro-compatible de registerApiRoutes.
 * @deprecated Utiliser registerApiRoutes.
 */
export const registerFeatureRoutes = registerApiRoutes;

/**
 * Retourne toutes les routes de features enregistrées.
 * Appelé à chaque requête par le router pour construire la liste complète.
 *
 * @returns {ReadonlyArray}
 */
export function getFeatureRoutes() {
  return _featureRoutes;
}

/**
 * Vide toutes les routes de features enregistrées.
 * Destiné aux tests ou à la réinitialisation de l'état ZEN.
 */
export function clearFeatureRoutes() {
  _featureRoutes.length = 0;
}
