import * as vscode from 'vscode';
import { FileSystemProjectScaffolder } from '../scaffolder/projectScaffolder';
import type { ProjectTemplateId } from '../scaffolder/templates';

/**
 * Project Scaffolder — Astra 의 Developer 빠른 시작 명령 (`g1nation.scaffoldProject`).
 *
 * activate() 안에 inline 으로 있던 ~35줄 wizard 를 별도 모듈로 분리. scaffolder
 * 인스턴스는 명령 등록 시 1회 생성 — 매 실행마다 new 할 필요 없고 외부에서 참조도
 * 안 됨 → 모듈 안에 가둠.
 */
export function registerScaffoldCommand(): vscode.Disposable {
    const scaffolder = new FileSystemProjectScaffolder();
    return vscode.commands.registerCommand('g1nation.scaffoldProject', async () => {
        const folders = vscode.workspace.workspaceFolders;
        if (!folders || folders.length === 0) {
            vscode.window.showErrorMessage('워크스페이스 폴더를 먼저 여세요.');
            return;
        }
        const name = await vscode.window.showInputBox({
            placeHolder: '프로젝트 이름 (영문/숫자/_/-, 2~40자)',
            prompt: 'Astra가 워크스페이스 안에 만들 프로젝트 폴더 이름',
            validateInput: (v) => /^[a-zA-Z0-9_-]{2,40}$/.test(v.trim()) ? null : '영문/숫자/_/- 만, 2~40자',
        });
        if (!name) return;
        const picked = await vscode.window.showQuickPick(
            scaffolder.listTemplates().map(t => ({ label: t.label, detail: t.detail, id: t.id })),
            { placeHolder: '템플릿 선택' }
        );
        if (!picked) return;

        const result = await scaffolder.scaffold({
            name: name.trim(),
            template: picked.id as ProjectTemplateId,
            rootDir: folders[0].uri.fsPath,
        });
        if (!result.ok) {
            vscode.window.showErrorMessage(`프로젝트 생성 실패: ${result.error}`);
            return;
        }
        const action = await vscode.window.showInformationMessage(
            `✅ ${name} 생성 완료 — ${result.projectPath}`,
            '폴더 열기',
            '닫기'
        );
        if (action === '폴더 열기') {
            await vscode.commands.executeCommand('revealFileInOS', vscode.Uri.file(result.projectPath));
        }
    });
}
