import { commands, window, languages, Range } from 'vscode';
import { ALXmlDocConfigurationPrefix } from './types';
import { ALObject } from './types/ALObject';
import { ALProcedure } from './types/ALProcedure';
import { ALDocCommentProvider } from './util/ALDocCommentProvider';
import { ALDocumentationQuickFixProvider } from './util/ALDocumentationQuickFix';
import { ALFixDocumentation } from './util/ALFixDocumentation';
import { ALHoverProvider } from './util/ALHoverProvider';
import { ALInheritDocDefinitionProvider } from './util/ALInheritDocDefinitionProvider';

export class RegisterProvider {

    /**
     * RegisterProvider constructor.
     */
    constructor() {
        /**
         * ALHoverProvider is providing Tooltip information for procedures and objects.
         */
        languages.registerHoverProvider({
            scheme: 'file',
            language: 'al'
        }, new ALHoverProvider());

        /**
         * ALDocCommentProvider is providing AL XML documentation templates after typing '///'.
         */
        languages.registerCompletionItemProvider({
            scheme: 'file',
            language: 'al'
        }, new ALDocCommentProvider(),
        '/');

        /**
         * ALInheritDocDefinitionProvider is providing AL XML documentation for inherit objects.
         */
        languages.registerDefinitionProvider({
            scheme: 'file',
            language: 'al'
        }, new ALInheritDocDefinitionProvider());

        /**
         * ALDocumentationQuickFixProvider is providing CodeActions to fix broken or missing XML documentations.
         */
        languages.registerCodeActionsProvider({
            scheme: 'file',
            language: 'al'
        }, new ALDocumentationQuickFixProvider());

        this.RegisterCodeActions();
    }

    private RegisterCodeActions() {        
        commands.registerCommand(`${ALXmlDocConfigurationPrefix}.fixDocumentation`, ( alProcedure: ALProcedure ) => {
            ALFixDocumentation.FixDocumentation(window.activeTextEditor, alProcedure);
        });
        commands.registerCommand(`${ALXmlDocConfigurationPrefix}.fixSummaryDocumentation`, ( alProcedure: ALProcedure ) => {
            ALFixDocumentation.FixSummaryDocumentation(window.activeTextEditor, alProcedure);
        });
        commands.registerCommand(`${ALXmlDocConfigurationPrefix}.fixParameterDocumentation`, ( alProcedure: ALProcedure ) => {
            ALFixDocumentation.FixParameterDocumentation(window.activeTextEditor, alProcedure);
        });
        commands.registerCommand(`${ALXmlDocConfigurationPrefix}.fixReturnDocumentation`, ( alProcedure: ALProcedure ) => {
            ALFixDocumentation.FixReturnTypeDocumentation(window.activeTextEditor, alProcedure);
        });
        commands.registerCommand(`${ALXmlDocConfigurationPrefix}.fixUnnecessaryParameterDocumentation`, ( alProcedure: ALProcedure, range: Range ) => {
            ALFixDocumentation.FixUnnecessaryParameterDocumentation(window.activeTextEditor, alProcedure, range);
        });
        commands.registerCommand(`${ALXmlDocConfigurationPrefix}.fixObjectDocumentation`, ( alObject: ALObject ) => {
            ALFixDocumentation.FixObjectDocumentation(window.activeTextEditor, alObject);
        });
    }

    public dispose() {

     }
}