import type { Extension } from "@codemirror/state";
import {
    lineNumbers,
    highlightSpecialChars,
    drawSelection,
    rectangularSelection,
    crosshairCursor,
    keymap
} from "@codemirror/view";
import { EditorView } from "@codemirror/view";
import { EditorState } from "@codemirror/state";
import {
    foldGutter,
    indentOnInput,
    syntaxHighlighting,
    defaultHighlightStyle,
    foldKeymap
} from "@codemirror/language";
import { history, defaultKeymap, historyKeymap } from "@codemirror/commands";
import {
    closeBrackets,
    closeBracketsKeymap,
    completionKeymap
} from "@codemirror/autocomplete";
import { lintKeymap } from "@codemirror/lint";
import {
    type CompletionSource, autocompletion, CompletionContext, startCompletion,
    currentCompletions, completionStatus, completeFromList, acceptCompletion
} from "@codemirror/autocomplete"
import DanbooruTags from "$lib/DanbooruTags";

export const basicSetup: Extension = /*@__PURE__*/ (() => [
    lineNumbers(),
    highlightSpecialChars(),
    history(),
    foldGutter(),
    drawSelection(),
    EditorState.allowMultipleSelections.of(true),
    indentOnInput(),
    syntaxHighlighting(defaultHighlightStyle, { fallback: true }),
    closeBrackets(),
    rectangularSelection(),
    crosshairCursor(),
    EditorView.lineWrapping,
    DanbooruTags.getCompletionExt(),

    keymap.of([
        ...closeBracketsKeymap,
        ...defaultKeymap,
        ...historyKeymap,
        ...foldKeymap,
        ...completionKeymap,
        ...lintKeymap
    ])
])();
