/*
 * 模块注册与分发中心
 * 作用：
 * - registerModule(name, impl): 注册模块实现（如 auth、media、camera、file）
 * - dispatch(action, params): 根据 action 形如 "ns.method" 分发到对应模块方法
 * - getModule/listModules: 获取单个模块或已注册模块列表
 */

const modules = Object.create(null);

/**
 * 注册模块实现。
 * @param {string} name - 模块命名空间（ns）
 * @param {Record<string, Function>} impl - 模块方法集合
 */
export function registerModule(name, impl) {
  if (!name || typeof name !== 'string') throw new Error('module name required');
  modules[name] = impl || {};
}

/**
 * 获取模块实现。
 * @param {string} name
 * @returns {Record<string, Function>|undefined}
 */
export function getModule(name) {
  return modules[name];
}

/**
 * 分发调用到对应模块方法。
 * @param {string} action - 形如 "ns.method" 的调用名
 * @param {any} params - 透传给模块方法的参数
 * @returns {Promise<any>} - 模块方法的返回值
 */
export async function dispatch(action, params) {
  const idx = action.indexOf('.');
  const ns = idx === -1 ? action : action.slice(0, idx);
  const method = idx === -1 ? '' : action.slice(idx + 1);
  const mod = modules[ns];
  if (!mod) throw new Error(`module not found: ${ns}`);
  const fn = mod[method];
  if (typeof fn !== 'function') throw new Error(`method not found: ${ns}.${method}`);
  return await fn(params);
}

/**
 * 列出当前已注册模块命名空间。
 * @returns {string[]}
 */
export function listModules() {
  return Object.keys(modules);
}