import { CompletionItem, CompletionItemKind, CompletionItemProvider, Position, TextDocument } from "vscode";

const XQLint = require("@quodatum/xqlint").XQLint;

export class XQueryCompletionItemProvider implements CompletionItemProvider {

    provideCompletionItems(document: TextDocument, position: Position): CompletionItem[] {
        const completionItems = new Array<CompletionItem>();
        const linter = new XQLint(document.getText());

        linter.getCompletions({ line: position.line, col: position.character }).forEach((x: any) => {
            completionItems.push(this._getCompletionItem(x));
        });

        return completionItems;
    }

    private _getCompletionItem(xqLintCompletionItem: any): CompletionItem {
        const completionItem = new CompletionItem(xqLintCompletionItem.name);
        completionItem.insertText = xqLintCompletionItem.value;

        switch (xqLintCompletionItem.meta) {
            // functions (always qualified with a colon)
            case "function":
                completionItem.kind = CompletionItemKind.Function;

                const funcStart = (xqLintCompletionItem.value.indexOf(":") + 1);
                const funcEnd = xqLintCompletionItem.value.indexOf("(");

                completionItem.insertText = xqLintCompletionItem.value.substring(funcStart, funcEnd);
            break;

            // variables and parameters (always qualified with a dollar sign)
            case "Let binding":
            case "Local variable":
            case "Window variable":
            case "Function parameter":
                completionItem.kind = CompletionItemKind.Variable;
                completionItem.insertText = xqLintCompletionItem.value.substring(1);
            break;

            // everything else
            default:
                completionItem.kind = CompletionItemKind.Text;
            break;
        }

        return completionItem;
    }

}