import {
    git,
    <%= dependencies.length || devDependencies.length ? "npm, pkg," : "" %>
    Task,
    TaskCategory,
    TaskOptions,
    <%= Object.keys(options).length ? "TaskOptionType," : "" %>
} from "@buurman/sdk";
<%= imports.map(ImportDeclaration).join("\n") %>

<%= types.map(TypeDeclaration).join("\n") %>

<%= interfaces.map(InterfaceDeclaration).join("\n") %>

<%= variables.map(VariableDeclaration).join("\n") %>

const task: Task<<%= taskOptionsInterface %>> = {
    name: <%= JSON.stringify(name) %>,
    npmPackage: require("../package.json").name,
    description: <%= JSON.stringify(description) %>,
    category: TaskCategory.<%= category %>,
    tags: <%= JSON.stringify(tags) %>,
    options: {
    <% Object.entries(options).forEach(([key, {name,required,type,defaultValue}]) => { %>
        "<%= key %>": {
            name: "<%= name %>",
            required: <%= required %>,
            type: TaskOptionType.<%= type %>,
            defaultValue: <%= defaultValue ? JSON.stringify(defaultValue) : undefined %>,
            // TODO validate <%= name %> option
            validate: value => true,
        },
    <% }) %>
    },
    apply: async () => {
        const startedWithACleanWorkingCopy = await git().hasCleanWorkingCopy();

        <%= dependencies.length ? `await npm().install(dependencies)` : `` %>
        <%= devDependencies.length ? `await npm().install(devDependencies, ["-D"])` : `` %>

        // TODO modify project accordingly

        const endedWithACleanWorkingCopy = await git().hasCleanWorkingCopy();

         const hasChangedFiles =
             startedWithACleanWorkingCopy && !endedWithACleanWorkingCopy;

        if (hasChangedFiles) {
            await git()
                .add(".")
                .commit("chore(<%= name %>): add <%= name %>")
                .execute();
        }
    },
    // TODO implement properly
    isInstalled: async () => (<%= [dependencies.length ? `(await pkg().hasDependencies(dependencies))` : undefined, devDependencies.length ? `(await pkg().hasDevDependencies(devDependencies))` : undefined].filter(Boolean).join(" && ") %>),
    // TODO implement properly
    isSupported: () => pkg().exists(),
};

export default task;
