/**
 * Registre runtime des pages publiques `/zen/<module>/<...>`.
 *
 * Chaque module externe enregistre un composant racine pour son namespace.
 * Le composant reçoit `{ params, segments }` où `segments` est le tableau
 * de chemins après `/zen/<module>/` ; le module fait son propre routage interne.
 *
 * Le préfixe `api` est réservé : tout enregistrement sous moduleName === 'api'
 * est rejeté pour éviter les collisions avec les routes API.
 */

const REGISTRY_KEY = Symbol.for('__ZEN_PUBLIC_MODULE_PAGES__');
if (!globalThis[REGISTRY_KEY]) globalThis[REGISTRY_KEY] = new Map();
/** @type {Map<string, { moduleName: string, Component: any, title?: string }>} */
const registry = globalThis[REGISTRY_KEY];

export function registerPublicModulePage({ moduleName, Component, title }) {
  if (typeof moduleName !== 'string' || !moduleName) {
    throw new TypeError('registerPublicModulePage: "moduleName" must be a non-empty string');
  }
  if (moduleName === 'api') {
    throw new Error('registerPublicModulePage: "api" is a reserved namespace under /zen/');
  }
  if (typeof Component !== 'function' && typeof Component !== 'object') {
    throw new TypeError(`registerPublicModulePage(${moduleName}): "Component" must be a React component`);
  }
  registry.set(moduleName, { moduleName, Component, title });
}

export function getPublicModulePage(moduleName) {
  return registry.get(moduleName);
}

export function getPublicModulePages() {
  return [...registry.values()];
}
