/** Module manager (formerly "plugins"): installed modules, catalog, install/uninstall and module windows. */
import { call, subscribe } from "../transport";
import type { ModuleManifest, ModuleWindowState, Payload } from "../types";

export const modules = Object.freeze({
  list: () => call<ModuleManifest[]>("core_modules_list", "plugins:list"),
  getState: () => call<Payload>("core_modules_get_state", "plugins:getState"),
  checkCatalog: () => call<Payload>("core_modules_check_catalog", "plugins:checkCatalog"),
  install: (releaseId: string) => call<Payload>("core_modules_install", "plugins:install", { releaseId }),
  uninstall: (moduleId: string) => call<Payload>("core_modules_uninstall", "plugins:uninstall", { pluginId: moduleId }),
  open: (moduleId: string) => call<ModuleManifest>("core_modules_open", "plugins:open", { pluginId: moduleId }),
  setArea: (area: { x: number; y: number; width: number; height: number; pageHeight: number } | null) => call<null>("core_modules_set_area", "plugins:setArea", area ?? {}),
  detach: (moduleId: string) => call<unknown>("core_modules_detach", "plugins:detach", { pluginId: moduleId }),
  collapse: (moduleId: string) => call<unknown>("core_modules_collapse", "plugins:collapse", { pluginId: moduleId }),
  close: (moduleId: string) => call<unknown>("core_modules_close", "plugins:close", { pluginId: moduleId }),
  onActivate: (callback: (moduleId: string) => void) => subscribe("core:moduleActivate", callback),
  onWindowState: (callback: (windows: ModuleWindowState[]) => void) => subscribe("core:pluginWindowState", callback)
});
