import * as path from 'path';
import type { BrainProfile } from '../../config';
import type { SecondBrainTrace } from '../../features/secondBrainTrace';

/**
 * Second Brain *전체* 평가 요청 ("내 제2뇌 분석해줘", "강점/약점은?") 류 prompt 가
 * 들어왔을 때 모델이 "데이터가 없어서 평가 불가" 같은 회피성 답변을 못 하도록
 * 시스템 prompt 에 prepend 하는 inventory 블록 + 마지막 방어선 fallback 답변.
 *
 * 두 함수 다 stateless — agent.ts 의 private 메서드를 그대로 추출.
 *
 * Why fallback 까지 필요한가: inventory 컨텍스트를 박아도 모델이 가끔 "분석할
 * 데이터가 없습니다" 류 답변을 만드는 회귀가 있었고 (`isNoBrainDataRefusal`
 * detection), 그 경우엔 답변 자체를 이 fallback 으로 덮어쓴다.
 */

/** 시스템 prompt 에 prepend 할 inventory 컨텍스트 블록. */
export function buildSecondBrainInventoryContext(activeBrain: BrainProfile, brainFiles: string[]): string {
    const relativeFiles = brainFiles.map((file) => path.relative(activeBrain.localBrainPath, file));
    const directoryCounts = new Map<string, number>();
    for (const rel of relativeFiles) {
        const topDir = rel.includes(path.sep) ? rel.split(path.sep)[0] : '(root)';
        directoryCounts.set(topDir, (directoryCounts.get(topDir) || 0) + 1);
    }

    const topDirectories = [...directoryCounts.entries()]
        .sort((a, b) => b[1] - a[1] || a[0].localeCompare(b[0]))
        .slice(0, 12)
        .map(([dir, count]) => `- ${dir}: ${count} markdown files`)
        .join('\n');

    const samples = relativeFiles
        .slice(0, 40)
        .map((file) => `- ${file}`)
        .join('\n');

    return [
        '[SECOND BRAIN INVENTORY]',
        'The user is asking about the currently selected Second Brain as a knowledge base. Use this inventory as direct evidence.',
        `Selected brain name: ${activeBrain.name}`,
        `Selected brain path: ${activeBrain.localBrainPath}`,
        `Markdown file count: ${brainFiles.length}`,
        brainFiles.length > 0
            ? 'Do not say the Second Brain has no data, no files, or cannot be evaluated because files were not provided.'
            : 'No Markdown files were found in the selected Second Brain path.',
        topDirectories ? `Top-level distribution:\n${topDirectories}` : 'Top-level distribution: none',
        samples ? `Sample files:\n${samples}` : 'Sample files: none',
        'For strengths and weaknesses, infer from the inventory and selected note excerpts. Mark broad conclusions as inference when they are not directly proven.',
    ].join('\n');
}

/**
 * 모델이 회피성 답변을 만들었을 때 덮어씌울 마지막 방어선 답변. 강점/약점/분포/
 * 활용 가능성을 사전 작성된 한국어 템플릿으로 채우되, 분포와 trace 결과만
 * inventory 데이터로 동적으로 메운다.
 */
export function buildSecondBrainInventoryFallbackAnswer(
    activeBrain: BrainProfile,
    brainFiles: string[],
    trace: SecondBrainTrace | null,
): string {
    const relativeFiles = brainFiles.map((file) => path.relative(activeBrain.localBrainPath, file));
    const directoryCounts = new Map<string, number>();
    for (const rel of relativeFiles) {
        const topDir = rel.includes(path.sep) ? rel.split(path.sep)[0] : '(root)';
        directoryCounts.set(topDir, (directoryCounts.get(topDir) || 0) + 1);
    }

    const topDirectories = [...directoryCounts.entries()]
        .sort((a, b) => b[1] - a[1] || a[0].localeCompare(b[0]))
        .slice(0, 8);
    const distribution = topDirectories
        .map(([dir, count]) => `- ${dir}: ${count}개`)
        .join('\n');
    const selectedDocs = trace?.retrievedDocuments
        .filter((doc) => doc.selectedForAnswerContext)
        .map((doc) => `- ${doc.path} (${doc.sourceType}, score ${doc.score})`)
        .join('\n') || '';

    return [
        '## 간단 요약',
        `현재 선택된 제2뇌는 비어 있지 않습니다. \`${activeBrain.localBrainPath}\` 아래에서 Markdown 파일 ${brainFiles.length}개를 확인했기 때문에, 강점과 약점을 평가할 수 있습니다.`,
        '',
        '## 강점',
        '1. 지식량이 충분합니다. 수천 개 규모의 Markdown 노트가 있어 단일 프로젝트 메모장이 아니라 실제 지식 베이스로 볼 수 있습니다.',
        '2. 상위 폴더 기준으로 주제가 나뉘어 있어 검색과 확장에 유리합니다.',
        '3. AI, UX, 프로젝트 로그처럼 실행 지식과 참고 지식이 함께 있어 기획, 리서치, 의사결정 보조에 쓸 수 있습니다.',
        '4. Trace가 실제 문서를 찾고 있으므로 연결 자체는 동작합니다.',
        '',
        '## 약점',
        '1. 검색 결과에서 인덱스 문서와 일반 지식 문서가 상위에 올라옵니다. 제2뇌 전체 평가에는 도움이 되지만, 구체적 판단 근거로는 밀도가 낮습니다.',
        '2. Project Evidence와 General Knowledge가 명확히 분리되지 않아 답변이 조심스러워집니다.',
        '3. “강점/약점 평가” 같은 전체 분석 요청에는 단일 키워드 검색보다 폴더 분포, 대표 문서, 최근 문서, 프로젝트 로그를 함께 보는 전용 분석 흐름이 필요합니다.',
        '4. 문서 수가 많아서 요약 인덱스, 태그, source type 메타데이터가 약하면 좋은 문서가 검색 순위에서 밀릴 수 있습니다.',
        '',
        '## 확인된 분포',
        distribution || '- 상위 폴더 없음',
        '',
        selectedDocs ? '## 이번 검색에서 잡힌 문서\n' + selectedDocs : '',
        '',
        '## 활용 가능성',
        '이 제2뇌는 프로젝트 회고, UX/비즈니스 판단, 기술 리서치, 제안서 초안, 의사결정 근거 정리, 고객 요구사항 검토에 쓸 수 있습니다. 다음 개선 포인트는 “인덱스 문서보다 실제 근거 문서를 우선 선택하는 검색 랭킹”과 “프로젝트 근거 문서에 명시적 메타데이터를 붙이는 것”입니다.',
    ].filter(Boolean).join('\n');
}
