import { BaseConfig, ConfigArguments } from "jsr:@shougo/ddc-vim/config";
import { SourceOptions } from "jsr:@shougo/ddc-vim/types";

type Filters = Record<string, {
  matchers: SourceOptions["matchers"];
  sorters: SourceOptions["sorters"];
  converters: SourceOptions["converters"];
}>;

export class Config extends BaseConfig {
  override config(args: ConfigArguments): Promise<void> {
    const filters = {
      fuzzy: {
        matchers: ["matcher_fuzzy"],
        sorters: ["sorter_fuzzy"],
        converters: ["converter_fuzzy"],
      },
      none: {
        matchers: [],
        sorters: [],
        converters: [],
      },
      sorter_fzf: {
        matchers: [],
        sorters: ["sorter_fzf"],
        converters: [],
      },
    } satisfies Filters;

    args.contextBuilder.patchGlobal(
      {
        autoCompleteEvents: [
          "InsertEnter",
          "TextChangedI",
          "TextChangedP",
          "TextChangedT",
          "CmdlineEnter",
          "CmdlineChanged",
        ],
        cmdlineSources: {
          "/": [],
          ":": ["cmdline"],
          "?": [],
          "@": [],
        },
        sources: ["yank", "around"],
        sourceOptions: {
          _: {
            ...filters.sorter_fzf,
            ignoreCase: true,
          },
          around: {
            mark: "周",
          },
          cmdline: {
            isVolatile: true,
            minAutoCompleteLength: 1,
            mark: "令",
          },
          file: {
            ...filters.none,
            sorters: ["sorter_file", "sorter_fzf"],
            forceCompletionPattern: "\\S/\\S*",
            mark: "紙",
          },
          input: {
            isVolatile: true,
            mark: "入",
            minAutoCompleteLength: 0,
          },
          line: {
            mark: "行",
          },
          lsp: {
            mark: "語",
          },
          "shell-native": {
            mark: "殻",
          },
          skkeleton: {
            ...filters.none,
            isVolatile: true,
            maxItems: 50,
            minAutoCompleteLength: 1,
            mark: "変",
          },
          skkeleton_okuri: {
            ...filters.none,
            isVolatile: true,
            mark: "送",
          },
          yank: {
            ...filters.fuzzy,
            mark: "貼",
          },
        },
        sourceParams: {
          lsp: {
            lspEngine: "lspoints",
          },
          "shell-native": {
            "shell": "fish",
          },
        },
        ui: "pum",
      },
    );
    return Promise.resolve();
  }
}