/**
 * Registre des modules `@zen/module-*` chargés.
 *
 * Un module est un package npm exportant :
 *   - manifest      : { name, version, permissions?, envVars? }
 *   - register      : () => void | Promise<void>
 *   - createTables  : async () => { created?: string[], skipped?: string[] }
 *   - dropTables    : async () => void
 *
 * La découverte (`discover.server.js`) lit le package.json du projet
 * consommateur et appelle registerModule() pour chaque dépendance détectée.
 *
 * Persisté via Symbol.for sur globalThis pour survivre aux hot-reloads.
 */

const REGISTRY_KEY = Symbol.for('__ZEN_MODULES_REGISTRY__');
if (!globalThis[REGISTRY_KEY]) globalThis[REGISTRY_KEY] = new Map();
/** @type {Map<string, object>} */
const registry = globalThis[REGISTRY_KEY];

export function registerModule(mod) {
  if (!mod || typeof mod !== 'object') {
    throw new TypeError('registerModule: argument must be an object');
  }
  const { manifest } = mod;
  if (!manifest || typeof manifest.name !== 'string' || !manifest.name) {
    throw new TypeError('registerModule: module.manifest.name must be a non-empty string');
  }
  if (typeof mod.register !== 'function') {
    throw new TypeError(`registerModule(${manifest.name}): module.register must be a function`);
  }
  registry.set(manifest.name, mod);
}

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

export function getRegisteredModule(name) {
  return registry.get(name);
}

export function clearRegisteredModules() {
  registry.clear();
}
