import { injectable } from 'inversify';
import vscode from 'vscode';

import { NamedElement } from '../../editor/ast/NamedElement';
import { ActionCreatorContext } from '../_base/ActionCreatorContext';
import { CodeActionCreator } from '../_base/CodeActionCreator';

@injectable()
export class AutoDocActionCreator extends CodeActionCreator {
	static readonly providedCodeActionKinds = [vscode.CodeActionKind.RefactorRewrite];

	isApplicable(creatorContext: ActionCreatorContext): boolean {
		return true;
	}

	buildClassAction(context: ActionCreatorContext, elementBlock: NamedElement) {
		const title = `AutoDoc for class \`${elementBlock.identifierRange.text}\` (AutoDev)`;
		return this.createDocAction(title, context.document, elementBlock);
	}

	buildMethodAction(context: ActionCreatorContext, elementBlock: NamedElement): vscode.CodeAction {
		const title = `AutoDoc for method \`${elementBlock.identifierRange.text}\` (AutoDev)`;
		return this.createDocAction(title, context.document, elementBlock);
	}

	private createDocAction(title: string, document: vscode.TextDocument, block: NamedElement): vscode.CodeAction {
		const codeAction = new vscode.CodeAction(title, AutoDocActionCreator.providedCodeActionKinds[0]);

		codeAction.isPreferred = false;
		codeAction.edit = new vscode.WorkspaceEdit();
		codeAction.command = {
			command: 'autodev.autoComment',
			title: title,
			arguments: [document, block, codeAction.edit],
		};

		return codeAction;
	}
}
