import {
  ConfigArguments,
  Context,
  Denops,
  DppOptions,
  ExtOptions,
  LazyExt,
  LazyMakeStateResult,
  LazyParams,
  Plugin,
  Protocol,
} from "../deps.ts";
import { Ext, getExt } from "../helper.ts";

export type GetLazyExtResults = Ext<LazyParams, LazyExt>;

export async function getLazyExt(args: ConfigArguments) {
  return await getExt<LazyParams, LazyExt>(args, "lazy");
}

export type makeStateArgs = {
  denops: Denops;
  context: Context;
  options: DppOptions;
  protocols: Record<string, Protocol>;
  lazyExt: LazyExt | undefined;
  lazyOptions: ExtOptions;
  lazyParams: LazyParams;
  plugins: Plugin[];
};

export async function makeState({
  denops,
  context,
  options,
  protocols,
  lazyExt,
  lazyOptions,
  lazyParams,
  plugins,
}: makeStateArgs): Promise<LazyMakeStateResult | undefined> {
  if (!lazyExt) throw "Failed load lazy extension.";
  const action = lazyExt.actions.makeState;
  return await action.callback({
    denops,
    context,
    options,
    protocols,
    extOptions: lazyOptions,
    extParams: lazyParams,
    actionParams: {
      plugins,
    },
  });
}