import * as vscode from 'vscode';
import { openKnowledgeMapEditor } from '../skills/agentKnowledgeMap';
import { createLessonCard, manageLessons } from './lessons';
import type { AgentExecutor } from '../agent';

/**
 * Experience Memory 명령 묶음 — knowledge map / lesson cards 의 CRUD entrypoint.
 * activate() 안에 있던 4개 command 를 한 곳으로 모음. `fromConversation` 만
 * agent 의 history 를 읽기 때문에 deps 가 필요. 나머지는 stateless.
 *
 * agent 는 getter 로 받음 — activate() 가 agent 인스턴스 변수에 할당한 *후* 이
 * commands 가 호출되므로 등록 시점엔 아직 undefined 일 수 있다. getter 가 호출
 * 시점의 최신 값을 반환.
 */
export interface LessonCommandsDeps {
    getAgent: () => AgentExecutor;
}

export function registerLessonCommands(deps: LessonCommandsDeps): vscode.Disposable[] {
    return [
        vscode.commands.registerCommand('g1nation.skills.editKnowledgeMap', async () => {
            await openKnowledgeMapEditor();
        }),
        // Experience Memory — create / browse lesson cards in the active brain.
        vscode.commands.registerCommand('g1nation.lesson.create', () => createLessonCard()),
        vscode.commands.registerCommand('g1nation.lesson.fromConversation', () => {
            // Pre-fill the Situation section from the most recent user request + assistant reply.
            const history = deps.getAgent().getHistory().filter((m: any) => !m.internal);
            const lastUser = [...history].reverse().find((m: any) => m.role === 'user');
            const lastAssistant = [...history].reverse().find((m: any) => m.role === 'assistant');
            if (!lastUser && !lastAssistant) {
                vscode.window.showInformationMessage('현재 대화 내용이 없습니다. 먼저 대화를 한 뒤 사용하세요. (빈 교훈을 만들려면 "Astra: New Lesson" 사용)');
                return;
            }
            const clip = (s: any, n: number) => { const t = String(s || '').replace(/\s+/g, ' ').trim(); return t.length > n ? t.slice(0, n) + '…' : t; };
            const situation = [
                lastUser ? `요청: ${clip(lastUser.content, 600)}` : '',
                lastAssistant ? `Astra 답변(요약): ${clip(lastAssistant.content, 800)}` : '',
                '',
                '<위 작업에서 무엇이 잘못됐거나 위험했는지를 아래 Mistake/Root Cause 에 적으세요>',
            ].filter(Boolean).join('\n');
            return createLessonCard(situation);
        }),
        vscode.commands.registerCommand('g1nation.lesson.manage', () => manageLessons()),
    ];
}
