import { System } from "./system.ts";
import { AssetJson } from "./asset_bundle/bundle.ts";

export interface Manifest<HookT> {
  name: string;
  requiredPermissions?: string[];
  // URLs to plugs whose dependencies are presumed to already be loaded (main use case: global.plug.json)
  imports?: string[];
  assets?: string[] | AssetJson;
  dependencies?: {
    [key: string]: string;
  };
  functions: {
    [key: string]: FunctionDef<HookT>;
  };
}

export type FunctionDef<HookT> = {
  // Read the function from this path and inline it
  // Format: filename:functionName
  path?: string;
  // Reuse an
  // Format: plugName.functionName
  redirect?: string;
  code?: string;
  env?: RuntimeEnvironment;
} & HookT;

export type RuntimeEnvironment = "client" | "server";

export interface Hook<HookT> {
  validateManifest(manifest: Manifest<HookT>): string[];

  apply(system: System<HookT>): void;
}