import { execSync } from 'child_process';
import inquirer from 'inquirer';

export async function nextJsPrompt() {
    const nextJsAns = await inquirer.prompt([
        {
            type: 'confirm',
            name: 'useTs',
            message: 'Would you like to use TypeScript?',
            default: true,
        },
        {
            type: 'confirm',
            name: 'useEslint',
            message: 'Would you like to use ESLint?',
            default: true,
        },
        {
            type: 'confirm',
            name: 'usePrettier',
            message: 'Would you like to use Prettier?',
            default: true,
        },
        {
            type: 'confirm',
            name: 'useSrc',
            message: 'Would you like your code inside a `src/` directory?',
            default: true,
        },
        {
            type: 'confirm',
            name: 'useApp',
            message: 'Would you like to use App Router? (recommended)',
            default: true,
        },
        {
            type: 'confirm',
            name: 'useTurbo',
            message: 'Would you like to use Turbopack for `next dev`?',
            default: true,
        },
        {
            type: 'confirm',
            name: 'customAlias',
            message:
                'Would you like to customize the import alias (`@/*` by default)?',
            default: false,
        },
    ]);

    return nextJsAns;
}

export async function defineAlias(
    useDefault: boolean,
    customAlias: boolean,
): Promise<string> {
    if (!useDefault && customAlias) {
        const newAlias: string = await inquirer
            .prompt([
                {
                    type: 'input',
                    name: 'newAlias',
                    message: 'Insert custom alias',
                    validate: input =>
                        input ? true : 'Alias must be inserted',
                },
            ])
            .then(ans => ans.newAlias);

        return newAlias;
    }

    return '@/*';
}

export function createNextApp(
    projectName: string,
    packageManager: string,
    useTs: boolean,
    useSrc: boolean,
    useTurbo: boolean,
    useApp: boolean,
    useEslint: boolean,
    alias: string,
): void {
    execSync(
        `npx create-next-app@latest ${projectName} --use-${packageManager} ${useTs ? '--ts' : '--js'} ${useSrc ? '--src-dir' : ''} ${useTurbo ? '--turbopack' : ''}  ${useApp ? '--app' : ''} ${useEslint ? '--eslint' : ''} --import-alias ${alias} --tailwind`,
        { stdio: 'inherit' },
    );
}
