/**
 * 자기 평가 정본 주입 + 충돌 신뢰도 비교 — 순수 로직 테스트.
 */
import * as fs from 'fs';
import * as os from 'os';
import * as path from 'path';
import { isSelfAssessRequest, buildSelfAssessContext } from '../src/lib/contextBuilders/selfAssessContext';
import { INVENTORY_FILE } from '../src/extension/featureInventory';
import { parseDocTrust, buildTrustRecommendation } from '../src/features/growth/conflictScan';

describe('isSelfAssessRequest — 자기 평가/기능 질의 감지', () => {
    test.each([
        '너의 기능 개선 아이디어 줘',
        'self-evolving 엔진을 더 날카롭게 만들 방법은?',
        '아스트라 아키텍처 분석하고 개선 방향 제안해줘',
        '시스템 고도화 방안 알려줘',
        '너 무슨 기능 있어?',
        '아스트라가 할 수 있는 일 목록',
    ])('감지: %s', (p) => expect(isSelfAssessRequest(p)).toBe(true));

    test.each([
        '오늘 업무 목록 알려줘',
        '이 회의록 요약해줘',
        '삼성전자 주가 어때',
        '커밋하고 푸쉬해줘',
    ])('비대상: %s', (p) => expect(isSelfAssessRequest(p)).toBe(false));
});

describe('buildSelfAssessContext', () => {
    test('인벤토리 있으면 전문 + 대조 지시 주입', () => {
        const brain = fs.mkdtempSync(path.join(os.tmpdir(), 'astra-sa-'));
        fs.writeFileSync(path.join(brain, INVENTORY_FILE), '# 인벤토리 v9\n- 기능 A', 'utf8');
        const block = buildSelfAssessContext(brain);
        expect(block).toContain('이미 있는 기능을 신규 제안하지 마라');
        expect(block).toContain('기능 A');
    });
    test('인벤토리 없으면 정직한 안내 (지어내기 방지)', () => {
        const block = buildSelfAssessContext(fs.mkdtempSync(path.join(os.tmpdir(), 'astra-sa-')));
        expect(block).toContain('생성되지 않음');
        expect(block).toContain('확인 필요');
    });
});

describe('충돌 신뢰도 비교', () => {
    const fm = (trust: string, conf: number) => `---\nsource_trust_level: "${trust}"\nconfidence_score: ${conf}\n---\n본문`;
    test('frontmatter 파싱', () => {
        const t = parseDocTrust(fm('S', 0.95), 123);
        expect(t).toMatchObject({ trustLevel: 'S', confidence: 0.95, mtimeMs: 123 });
        expect(parseDocTrust('본문만 있음', 1).trustLevel).toBe('');
        expect(parseDocTrust('본문만 있음', 1).confidence).toBe(-1);
    });
    test('신규 S vs 기존 C → 신규 우선', () => {
        const r = buildTrustRecommendation(parseDocTrust(fm('S', 1.0), 2), parseDocTrust(fm('C', 0.5), 1));
        expect(r).toContain('신규 우선');
    });
    test('신규 등급없음 vs 기존 S → 기존 우선 (최신이어도 신뢰가 이김)', () => {
        const r = buildTrustRecommendation(parseDocTrust('본문', 2), parseDocTrust(fm('S', 1.0), 1));
        expect(r).toContain('기존 우선');
    });
    test('양쪽 메타 없음 → 권고 보류 (근거 없는 권고 금지)', () => {
        const r = buildTrustRecommendation(parseDocTrust('a', 2), parseDocTrust('b', 1));
        expect(r).toContain('권고 보류');
    });
    test('비등 → 보류', () => {
        const r = buildTrustRecommendation(parseDocTrust(fm('A', 0.8), 2), parseDocTrust(fm('A', 0.9), 1));
        expect(r).toContain('권고 보류');
    });
});
