/**
 * 추출된 웹사이트 본문 → 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}}`;

// ── 프롬프트 빌드 ────────────────────────────────────────────────────────────

export function buildWikifyPrompt(extracted: any, userContent: string, canonical?: CanonicalWikiFormat | null): string {
    const fmt: CanonicalWikiFormat = canonical && canonical.commonRules && canonical.frontmatter && canonical.sections
        ? canonical
        : { version: FALLBACK_VERSION, commonRules: FALLBACK_COMMON_RULES, frontmatter: FALLBACK_FRONTMATTER, sections: FALLBACK_SECTIONS };

    const today = new Date().toISOString().slice(0, 10);
    const topic = (userContent.trim() || extracted?.title || extracted?.url || '웹사이트 지식').trim();
    const url = extracted?.url || '';
    const idSlug = (topic.toLowerCase().replace(/\s+/g, '-').replace(/[^a-z0-9가-힣-]/g, '').slice(0, 80)) || 'web-wiki';
    const headings = Array.isArray(extracted?.headings) ? extracted.headings.slice(0, 40) : [];
    const body = String(extracted?.text || '').slice(0, 30000);

    const vars = {
        ID: idSlug, TITLE: topic, TOPIC: topic, ROOT: topic, TODAY: today,
        TAGS: '"web", "wikify"', SOURCES: `["${url}"]`,
        ORIGIN: `Astra /wikify 로 ${url} 본문에서 초안 생성.`,
    };

    return `임무: 아래 웹사이트에서 추출한 본문을 근거로 P-Reinforce v${fmt.version.replace('-embedded', '')} 규격에 맞춰 고밀도 지식 문서를 작성하시오.
주제: '${topic}'

[필수 규칙]
1. 반드시 아래 [웹사이트 본문]의 내용만을 근거로 작성하시오. 외부 지식을 절대 섞지 마시오.
2. 반드시 아래 Markdown 템플릿과 Frontmatter 형식을 정확히 따르시오. 섹션 이름과 구조를 변경하지 마시오.
3. 본문에 없는 정보는 지어내지 말고, 해당 섹션에 "소스에서 확인되지 않음"이라고 명시하시오.
4. 한국어로 작성하시오. 관련 개념·고유명사는 [[대괄호 두 개]]로 감싸 위키 링크로 만드시오. 위키 링크는 반드시 \`[[\` 로 열고 \`]]\` 로 닫으시오.
5. 원문이 JSON Schema·API 명세·기술 스펙·설정 레퍼런스인 경우, '📖 세부 내용'에 등장하는 모든 필드·속성·파라미터를 **누락 없이** 마크다운 표로 정리하시오. 표 컬럼은 [필드 | 타입 | 필수/선택 | 제약·설명]. 원문의 \`required\` 배열에 있는 항목만 '필수'로 표기하고, 그 목록을 임의로 바꾸거나 추가하지 마시오.
6. 이 문서의 출처는 웹 본문 1건이므로 '## 📚 출처'의 [S1]은 위 URL을 가리키며, source_trust_level 은 사이트 성격(공식 문서/학술 S~A, 기술 블로그 B, 커뮤니티/익명 C~D)으로 평가하시오.
${fill(fmt.commonRules, vars)}

[웹사이트 메타]
- URL: ${url}
- 제목: ${extracted?.title || '(없음)'}
- 설명: ${extracted?.description || '(없음)'}
- 주요 헤딩: ${headings.join(' / ') || '(없음)'}

[웹사이트 본문]
\`\`\`
${body}
\`\`\`

[출력 템플릿 - 이 형식을 정확히 따르시오]

${fill(fmt.frontmatter, vars)}

${fill(fmt.sections, vars)}`;
}
