/**
 * 추출된 웹사이트 본문 → P-Reinforce 위키 문서 프롬프트.
 *
 * 포맷 정본은 Datacollect 브리지의 wiki_format.mjs — 핸들러가
 * GET /api/wiki/template 로 받아 `canonical` 로 주입한다 (양쪽 포맷 통일).
 * 브리지가 구버전(엔드포인트 없음)일 때만 아래 내장 사본(fallback)을 쓴다.
 * 내장 사본은 정본을 따라 갱신하되, 차이가 생기면 정본이 항상 옳다.
 */

export interface CanonicalWikiFormat {
    version: string;
    /** 규칙 7-15 (별칭·출처·동적 신뢰도·그래프·논리 도메인 분류…), {{ROOT}} placeholder. */
    commonRules: string;
    /** Frontmatter 골격 — {{ID}} {{TITLE}} {{TODAY}} {{TAGS}} {{SOURCES}}. */
    frontmatter: string;
    /** 본문 섹션 골격 — {{TOPIC}} {{ROOT}} {{TODAY}} {{ORIGIN}}. */
    sections: string;
}

/** 정본 골격의 placeholder 치환. */
function fill(tpl: string, vars: Record<string, string>): string {
    return tpl.replace(/\{\{(\w+)\}\}/g, (_, k) => vars[k] ?? '');
}

// ── 내장 fallback (정본 wiki_format.mjs v3.1 사본 — 브리지 구버전 대비) ────────

const FALLBACK_VERSION = '3.1-embedded';

const FALLBACK_COMMON_RULES = `
7. [별칭] Frontmatter 'aliases'에 동의어·약어·영문/국문 표기 3-8개를 YAML 리스트로 채우시오.
8. [출처] '세부 내용' 주장 끝에 [S1],[S2] 인라인 표기 + 문서 끝 '## 📚 출처'에 번호별 제목/URL 나열, Frontmatter 'raw_sources'에도 동일 기입(placeholder 금지).
9. [신뢰도] 소스 평가로 source_trust_level(S/A/B/C/D)·confidence_score(0.00-1.00) 부여(문서마다 다르게). 이 값은 지식 충돌 시 우선순위 판단에 사용되므로 정직하게 평가하시오.
10. [그래프] '## 🔗 지식 그래프' 항상 작성: 루트 [[{{ROOT}}]] + 관련 개념 2개+ 링크.
11. [분류] category는 폴더경로 말고 논리 도메인(AI_and_ML/Frontend/Architecture 등, 없으면 "Topic").
12. [비교] 대안·경쟁 기술이 있으면 '## ⚖️ 비교 및 선택 기준'에 표(|항목|장점|단점|언제 선택|), 없으면 생략.
13. [코드] 소스에 코드가 있으면 '## 💻 코드 패턴'에 최소 스니펫(언어/버전), 없으면 "소스에 코드 예시 없음".
14. [완결성] 빈 섹션·(TODO)·플레이스홀더 금지. 근거 없으면 "소스에서 확인되지 않음".
15. [인용정렬] 인라인 [S#]는 '## 📚 출처' 번호와 1부터 순차 일치.`;

const FALLBACK_FRONTMATTER = `---
id: {{ID}}
title: "{{TITLE}}"
category: "Topic"
status: "draft"
verification_status: "conceptual"
canonical_id: ""
aliases: []
duplicate_of: ""
source_trust_level: "B"
confidence_score: 0.85
created_at: {{TODAY}}
updated_at: {{TODAY}}
review_reason: ""
merge_history: []
tags: [{{TAGS}}]
raw_sources: {{SOURCES}}
applied_in: []
github_commit: ""
---`;

const FALLBACK_SECTIONS = `# [[{{TOPIC}}]]

## 🎯 한 줄 통찰 (One-line insight)
(이 주제의 핵심 가치를 관통하는 강력한 한 줄 정의)

## 🧠 핵심 개념 (Core concepts)
(이 주제를 구성하는 가장 중요한 3-5가지 핵심 기둥/개념)

## 🧩 추출된 패턴 (Extracted patterns)
(소스에서 발견된 반복되는 구조, 전략, 설계 패턴 또는 휴리스틱)

## ⚖️ 비교 및 선택 기준 (Comparison & decision criteria)
(이 주제에 대안·경쟁 기술이 있을 때만 작성. 대안이 없으면 이 섹션 전체를 생략.)

| 항목 (Option) | 장점 | 단점 | 언제 선택 |
|---|---|---|---|

## 📖 세부 내용 (Details)
(소스에서 합성된 상세하고 전문적인 설명. 논리적 단락이나 글머리 기호로 구분하시오.)

## ⚖️ 모순 및 업데이트 (Contradictions & updates)
(소스 내에서 상충되는 정보가 있거나, 기존 상식과 다른 최신 정보가 있다면 서술하시오.)

## 🛠️ 적용 사례 (Applied in summary)
(소스에서 실제 적용된 코드·커밋·프로젝트·결정이 발견되면 요약. 없으면 "현재 발견된 실제 적용 사례가 없습니다.")

## 💻 코드 패턴 (Code patterns)
(소스에 코드·구현·API 사용법이 있으면 최소 스니펫을 언어/버전과 함께. 없으면 "소스에 코드 예시 없음".)

## ✅ 검증 상태 및 신뢰도
- **상태:** draft
- **검증 단계:** conceptual (실제 적용 사례 발견 시 applied/validated로 승격 가능)
- **출처 신뢰도:** (소스 평가에 따라 S/A/B/C/D 중 부여 — Frontmatter source_trust_level과 일치)
- **신뢰 점수:** (0.00-1.00 평가값 — Frontmatter confidence_score와 일치)
- **중복 검사 결과:** 신규 생성 (New discovery)

## 🔗 지식 그래프 (Knowledge Graph)
(항상 작성 — 이 문서를 위키 그래프에 연결한다. 고아 문서 금지.)
- **상위/루트:** [[{{ROOT}}]]
- **관련 개념:** (직접 관련된 핵심 개념 2개 이상을 [[대괄호 두 개]]로.)
- **참조 맥락:** (이 지식이 어떤 작업·주제·결정에서 참조될지 한 줄로.)

## 📚 출처 (Sources)
('세부 내용'의 [S1], [S2] 인라인 표기와 번호를 일치시키시오.)
- [S1]

## 📝 변경 이력 (Change history)
- {{TODAY}}: {{ORIGIN}}`;

/** 내장 정본 사본 — wikiFormat(공용 빌더)이 브리지 실패 시 사용. 이 파일이 사본의 단일 소유자. */
export const EMBEDDED_FALLBACK: CanonicalWikiFormat = {
    version: FALLBACK_VERSION,
    commonRules: FALLBACK_COMMON_RULES,
    frontmatter: FALLBACK_FRONTMATTER,
    sections: FALLBACK_SECTIONS,
};

// ── 프롬프트 빌드 ────────────────────────────────────────────────────────────
// v2.2.278 구조 통일: 골격 조립은 wikiFormat.buildKnowledgeWikiPrompt (단일 정본
// 빌더) 가 담당하고, 여기는 소스 종류별 기술자(KnowledgeSource)만 정의하는 얇은
// 래퍼다. 새 소스 종류를 추가할 땐 이 패턴을 따를 것 — 포맷 파편화 금지.

export function buildWikifyPrompt(extracted: any, userContent: string, canonical?: CanonicalWikiFormat | null): string {
    const { buildKnowledgeWikiPrompt } = require('../wikiFormat') as typeof import('../wikiFormat');
    const topic = (userContent.trim() || extracted?.title || extracted?.url || '웹사이트 지식').trim();
    const url = extracted?.url || '';
    const headings = Array.isArray(extracted?.headings) ? extracted.headings.slice(0, 40) : [];
    return buildKnowledgeWikiPrompt({
        kind: 'web',
        topic,
        body: String(extracted?.text || ''),
        meta: {
            URL: url,
            제목: extracted?.title || '(없음)',
            설명: extracted?.description || '(없음)',
            '주요 헤딩': headings.join(' / ') || '(없음)',
        },
        tags: ['wikify'],
        sourceRef: url || topic,
        extraRules: [
            `원문이 JSON Schema·API 명세·기술 스펙·설정 레퍼런스인 경우, '📖 세부 내용'에 등장하는 모든 필드·속성·파라미터를 **누락 없이** 마크다운 표로 정리하시오. 표 컬럼은 [필드 | 타입 | 필수/선택 | 제약·설명]. 원문의 \`required\` 배열에 있는 항목만 '필수'로 표기하고, 그 목록을 임의로 바꾸거나 추가하지 마시오.`,
        ],
        trustHint: '사이트 성격(공식 문서/학술 S~A, 기술 블로그 B, 커뮤니티/익명 C~D)으로',
        origin: `Astra /wikify 로 ${url} 본문에서 초안 생성.`,
    }, canonical);
}

/**
 * 이메일 스레드 → P-Reinforce 정본 위키 문서 프롬프트 (v2.2.277).
 * /wikify 와 **동일한 정본 템플릿**(frontmatter·섹션·지식그래프·출처)을 사용해
 * 이메일 지식 문서도 위키 규격에 통일한다. 이메일 특수 규칙(발신자·시점·요청
 * 보존, 액션 표)만 추가.
 */
export function buildEmailCanonicalWikifyPrompt(
    subject: string,
    transcript: string,
    meta: { participants?: string[]; dateRange?: string },
    canonical?: CanonicalWikiFormat | null,
): string {
    const { buildKnowledgeWikiPrompt } = require('../wikiFormat') as typeof import('../wikiFormat');
    const topic = (subject || '이메일 지식').trim();
    return buildKnowledgeWikiPrompt({
        kind: 'email',
        topic,
        body: transcript,
        meta: {
            제목: topic,
            참여자: (meta.participants || []).join(', ') || '(미상)',
            기간: meta.dateRange || '(미상)',
        },
        tags: ['wikify'],
        sourceRef: `email:${topic.replace(/"/g, "'")}`,
        extraRules: [
            `이메일 특수 규칙: '📖 세부 내용'에 **누가·언제·무엇을 말/요청/결정했는지** 시간 흐름대로 보존하고, 섹션 끝에 액션 표(| 누가 | 무엇을 | 기한 | 근거(메시지 번호) |)를 넣으시오. 액션이 없으면 "액션 없음".`,
            `시점 명시 (사고 방지): **모든 상태 서술에 날짜를 병기**하시오 — "진행 중/예정/완료/논의 중" 같은 현재형 서술은 반드시 근거 메일 날짜 기준으로 쓴다 (예: "2026-07-02 기준 진행 중", "6/30 메일에서 요청됨"). **날짜 없는 현재형 서술 금지** — 이 문서는 나중에 읽히므로 시점 없는 "현재"는 독자를 오도한다. '🎯 한 줄 통찰'에도 기준 날짜를 포함하시오.`,
        ],
        trustHint: '당사자 간 원문 교신이므로 A~B 로',
        origin: 'Astra /email wikify 로 이메일 스레드에서 초안 생성.',
    }, canonical);
}
