/**
 * v2.2.278 — 위키 문서 포맷 통일 (봉투 + 공용 빌더).
 */
import { ensureFrontmatter, hasFrontmatter, slugifyId, buildKnowledgeWikiPrompt } from '../src/features/datacollect/wikiFormat';
import { buildWikifyPrompt, buildEmailCanonicalWikifyPrompt } from '../src/features/datacollect/prompts/wikifyPrompt';

describe('ensureFrontmatter — 봉투 통일', () => {
    test('frontmatter 없는 보고서형 문서에 정본 봉투 부착', () => {
        const out = ensureFrontmatter('회의록 주간회의 2026-07-03', '# 회의록\n내용…', {
            docType: 'meeting', sources: ['transcript.txt'],
        });
        expect(out.startsWith('---')).toBe(true);
        expect(out).toContain('title: "회의록 주간회의 2026-07-03"');
        expect(out).toContain('category: "meeting"');
        expect(out).toContain('tags: ["meeting", "astra"]');
        expect(out).toContain('raw_sources: ["transcript.txt"]');
        expect(out).toContain('# 회의록');           // 본문 보존
        expect(out).toContain('## 📝 변경 이력');
    });

    test('이미 frontmatter 있는 문서(정본 프롬프트 산출물)는 그대로', () => {
        const doc = '---\nid: x\n---\n본문';
        expect(ensureFrontmatter('t', doc, { docType: 'wikify' })).toBe(doc);
    });

    test('코드펜스로 감싼 frontmatter 도 인식 (LLM 출력 변형 대응)', () => {
        expect(hasFrontmatter('```markdown\n---\nid: x\n---\n```')).toBe(true);
        expect(hasFrontmatter('# 그냥 제목')).toBe(false);
    });

    test('slugifyId — 한글 유지·특수문자 제거·80자 캡', () => {
        expect(slugifyId('회의록 A/B 테스트!', 'x')).toBe('회의록-ab-테스트');
        expect(slugifyId('', 'fallback')).toBe('fallback');
    });
});

describe('buildKnowledgeWikiPrompt — 단일 정본 빌더', () => {
    test('kind별 규칙 주입 + 정본 골격', () => {
        const p = buildKnowledgeWikiPrompt({
            kind: 'slack', topic: '배포 논의', body: 'BODY',
            meta: { 채널: '#dev' }, sourceRef: 'slack:#dev',
            extraRules: ['슬랙 특수 규칙 X'], trustHint: '내부 교신이므로 A~B 로',
        }, null);
        expect(p).toContain("주제: '배포 논의'");
        expect(p).toContain('5. 슬랙 특수 규칙 X');           // extraRules 번호 이어붙임
        expect(p).toContain('6. 이 문서의 출처는 slack');      // trust 규칙이 그 다음 번호
        expect(p).toContain('- 채널: #dev');
        expect(p).toContain('## 🎯 한 줄 통찰');
        expect(p).toContain('## 🔗 지식 그래프');
        expect(p).toContain('raw_sources: ["slack:#dev"]');
    });

    test('web·email 래퍼가 같은 정본 골격을 공유 (파편화 종료)', () => {
        const web = buildWikifyPrompt({ url: 'https://x.com', title: 'T', text: 'B' }, '', null);
        const email = buildEmailCanonicalWikifyPrompt('T', 'B', {}, null);
        for (const marker of ['[필수 규칙]', '[소스 메타]', '[소스 본문]', '## 🎯 한 줄 통찰', '## 📚 출처', 'P-Reinforce v3.1']) {
            expect(web).toContain(marker);
            expect(email).toContain(marker);
        }
        // 종류별 특수 규칙은 각자 유지
        expect(web).toContain('JSON Schema');
        expect(email).toContain('누가·언제·무엇을');
    });
});
