/**
 * /email 프롬프트 — 위키화(지식 문서 합성) + 회신 초안. (v2.2.269)
 * Datacollect bridge 의 email wikify 프롬프트와 같은 P-Reinforce 섹션 구조를 따라
 * brain(제2뇌) 문서 포맷 일관성을 유지한다. 환각 방지 규칙 동일.
 */

export interface EmailForPrompt {
    subject: string;
    from: string;
    to?: string;
    date: string;
    body: string;
}

/** 메일(들)을 프롬프트용 트랜스크립트로 직렬화 — 메시지당 4,000자, 총 16,000자 컷. */
export function buildEmailTranscript(mails: EmailForPrompt[]): string {
    return mails
        .map((m, i) => {
            const body = (m.body || '').slice(0, 4000);
            return `--- 메시지 ${i + 1} | ${m.date} | from: ${m.from}${m.to ? ` | to: ${m.to}` : ''}\n${body}`;
        })
        .join('\n\n')
        .slice(0, 16000);
}

export function buildEmailWikifyPrompt(subject: string, transcript: string): string {
    return `다음 이메일 스레드를 사실 기반 지식 문서로 합성하라.
[규칙] 스레드에 명시된 사실만 쓴다. 수치·날짜·금액·고유명사는 원문 그대로 보존(요약으로 뭉개지 말 것). 외부 지식 추가 금지. 근거가 약하면 "확인 필요"로 표기. 아래 섹션 구조를 정확히 유지한다.

# ${subject}

## 🎯 한 줄 통찰
(이 스레드의 핵심을 한 문장으로)

## 🧠 핵심 개념
(논의된 개념·용어·대상 — 개조식)

## 🧩 추출된 패턴
(반복되는 요구·의사결정 방식·관계 — 있으면. 없으면 "해당 없음")

## 📖 세부 내용
(시간 흐름·핵심 논의·결정·요청 정리. 누가 무엇을 언제 말/요청했는지 보존.)

## ✅ 액션 / 요청 사항
(| 누가 | 무엇을 | 기한 | 근거(메시지 번호) | 표. 없으면 "없음")

[이메일 스레드]
\`\`\`
${transcript}
\`\`\``;
}

/**
 * 받은편지함 브리핑 프롬프트 — 스레드 그룹 데이터를 사람이 읽는 현황 보고로.
 * 순서·분류·답변여부는 코드가 이미 판정 — LLM 은 각 스레드의 '무슨 이야기인지'
 * 한 줄 요약과 우선순위 제안만 담당 (판정 뒤집기 금지).
 */
export function buildInboxBriefPrompt(threadsBlock: string): string {
    return `아래는 받은편지함을 주제(스레드)별로 묶고 답변 여부·대기시간까지 판정한 데이터다. 당신은 **PM 비서**다 — 이 브리핑은 메일 목록이 아니라 **의사결정 중심의 업무 관리 보고서**다: "무엇을 결정해야 하고, 지연되면 어떤 영향이 있는지"가 먼저 보여야 한다.

# 판정 규칙 (데이터 우선 — 재분류 금지)
- 데이터(타임라인·본문발췌·스니펫)에 있는 내용만 사용. 없는 결론·약속·수치를 지어내지 말 것.
- 상태 이모지는 데이터 판정 그대로: 회신대기 → 🔴 회신 필요 / 공넘김 → 🟡 상대 회신 대기.
- 참조번호([O1 O2] 등)는 반드시 보존 — 사용자가 \`/email read O2\` 로 이어간다.

# 상태 3분류 (회신대기 항목을 성격으로 나눔 — "회신 필요"에 섞인 것들 분리)
- 🟣 **결정 필요**: 내 의사결정이 걸린 것 (승인·선택·판단).
- 🔴 **회신 필요**: 답장을 보내야 끝나는 것.
- 🟡 **확인만**: 읽고 확인하면 끝 (회신 불요·정보 공유성). **수신=CC(회신불요) 표시가 있는 스레드는 무조건 여기로** — 내가 참조 수신자라 회신 대상이 아님.
- ⏳ 상태가 '공넘김'인 것 = 상대 회신 대기 — **7일 이상 장기 건만 표시** (단기 대기는 건수만).

# 우선순위 분류 (🟣/🔴 를 시급도로)
- 🔥 **오늘 처리**: 결정이 걸려 있거나, 기한 임박·2일+ 대기·읽지않음.
- ⚠ **이번주 처리**: 2~3일 내 처리하면 되는 것.
- 🔥 안에서는 **효과 대비 시간(ROI) 순** — 영향 크고 소요 짧은 것 먼저.

# 항목 작성 규칙
- **성격 태그** 하나: [계약] [QA] [런칭] [개발] [영상] [정산] [보안] [협업] [기타].
- **프로젝트명** 추출: 제목·내용의 프로젝트/고객사 (예: 하이마트, 롯데온, 락인컴퍼니, 하이브, Castlabs) — 위험도+건수 병기: 그 프로젝트에 🔥오늘 건이 있으면 🔴(오늘·n), ⚠이번주면 🟠(이번주·n), 확인만이면 🟡(확인·n), 그 외 🟢.
- **짧은 제목**: RE/FW·회사명 괄호 떼고 5~14자. 원본은 Outlook에 있으니 줄여도 됨.
- **결정 ≠ 내 액션 (엄격 구분)**: '결정'은 **Yes/No 또는 방향을 정하는 판단만** (예: "파트3 수정 여부", "런칭 승인 여부"). 검토·회신·피드백 작성·확인은 결정이 아니라 **'내 액션'**. 결정거리가 없으면 결정 줄을 **생략**하고 상태는 🔴 회신 필요로.
- **필드 순서 = 읽는 순서**: 결정(있을 때만) → 영향 → 예상시간 → From/내 액션/권장기한 → 요약 → Timeline.
- **From**: 메일 보낸 사람. **내 액션**: 내가 할 일 구체 동사. **권장기한**: 메일 명시 기한은 그대로, 없으면 "권장: 오늘/이번주".
- **영향 = P등급 + 4종**: P1 🚨 고객 / P1 🚨 계약 / P2 🚨 일정 / P3 🚨 비용·내부. 해당 없으면 "—". 🔥 안의 정렬은 P1 → P2 → P3, 같은 등급이면 소요 짧은 것 먼저.
- **예상시간**: 확인만 5분 / 회신 15분 / 검토 30분 / 회의 1시간.
- **시간 표기**: 48시간 미만 "N시간", 그 이상 반드시 **"N일"** (737시간 같은 표기 금지).
- **Timeline**: 타임라인에 메시지가 **2건 이상**일 때만 세로 Timeline (마지막 줄 "**현재: 내 액션 필요 (<대기>)**" 통일). **1건뿐이면** "최근 업데이트: <MM/DD> <발화자> <요지>" 한 줄로.
- **인명·고유명사는 데이터 표기를 글자 그대로 복사** — 철자 변형·오타 생성 금지 (김성환→김성성 같은 오류 금지).
- 데이터에 없는 결론·약속·수치 금지. 🔥/⚠ 는 상세 블록, 🟡/⏳ 는 한 줄씩만.
- **숫자 정합성 (최우선)**: 🎯 Today Focus 는 **🔥 오늘 처리 항목과 1:1 동일** (같은 건수·같은 항목 — 목록에 없는 작업 추가 금지). 총시간 = 오늘 처리 예상시간의 합. 📈 계산은 오늘 처리분만 차감 (전부 0 되는 계산 금지).

# 출력 형식 (마크다운, 이 구조 정확히)
■ **메일 현황**
- 상태: 🟣 결정 필요 n · 🔴 회신 필요 n · 🟡 확인만 n
- 우선순위: 🔥 오늘 n · ⚠ 이번주 n
- 장기 미처리: ⏳ 상대 대기 n · 내 후속 지연 n
- 프로젝트: 🔴 하이마트(오늘·3) · 🟠 롯데온(이번주·2) · 🟡 칼리버스(확인·4) · 🟢 기타 n건

## 🔥 오늘 처리 (n건 · P등급순)

**[태그] <짧은 제목>** — 🟣 결정 필요 · **15분** · [참조번호]
- 결정: <Yes/No·방향 판단 한 줄 — 없으면 이 줄 생략>
- 영향: P1 🚨 <고객|계약> (P2 일정 / P3 비용·내부)
- From: <보낸 사람> / 내 액션: <구체 동사> / 권장기한: <기한>
- 요약: <핵심 요지 1줄>
- 원본: "<데이터의 주제(원제목) 글자 그대로>" — Outlook에서 열기: \`/email open <참조번호>\`
- Timeline: (2건+일 때 — 세로, 마지막 "**현재: 내 액션 필요 (<대기>)**") / 1건이면 "최근 업데이트: <MM/DD> <요지>"

## ⚠ 이번주 처리 (n건)
(같은 블록 형식)

## 🟡 확인만 (n건 · 상위 5건)
- [태그] <짧은 제목> — <요지 반 줄> ([참조번호] · 5분)
(+<n-5>건 더)

## ⏳ 장기 대기 — 7일 이상
**상대 답변 대기 (m건)**
- [태그] <짧은 제목> — <누구> 대기 · **<N일째>** ([참조번호])
**내 후속 지연 (k건)** — 위 처리 목록에 포함됨, 여기선 상기용
- <짧은 제목> — **<N일째>** 방치
(7일 미만 <나머지>건은 생략 — 정상 진행 중)

## 🎯 Today Focus — 오늘 처리 <n>건 · 총 <합계>분
① <짧은 제목> — <내 액션> (<소요>분)
(🔥 오늘 처리와 1:1 — 임의 항목 추가 금지)

## 📈 오늘 처리 완료 시
- 회신·결정 필요 <N>건 → <N-오늘n>건 · 🟣 결정 <n>건 → <남는>건
- **오늘 완료 예상**: ✅ 회신 <n>건 · ✅ 승인/결정 <n>건 · ✅ 검토 <n>건 — 총 <합계>분
- **오늘 안 하면**: <P1·P2 영향 집계 — 예: 고객 1건 · 계약 2건 지연 가능>

[스레드 데이터]
${threadsBlock}`;
}

/**
 * 시점 헤더 주입 (v2.2.282, 결정론) — 이메일 지식 문서 상단에 "이 지식이 어느
 * 기간의 메일에 근거하는지"를 박는다. RAG 답변이 "진행 중" 같은 서술을 인용할 때
 * 사용자가 시점을 오인하는 사고 방지. LLM 출력에 의존하지 않고 코드가 삽입.
 */
export function injectTimeHeader(doc: string, dateRange: string, generatedYmd: string): string {
    if (!dateRange || !doc) return doc;
    const header = `> 🕒 **기준 시점**: 이메일 ${dateRange} (문서 생성 ${generatedYmd}) — 아래 내용은 이 기간 메일에 근거하며, 이후 상황이 변했을 수 있음.`;
    const lines = doc.split('\n');
    let start = 0;
    // frontmatter(---) 블록이 있으면 그 뒤부터.
    if (lines[0]?.trim().startsWith('---')) {
        const end = lines.findIndex((l, idx) => idx > 0 && l.trim() === '---');
        if (end > 0) start = end + 1;
    }
    // 첫 H1 제목 바로 아래에 삽입 — 어떤 청크 분할에서도 문서 앞머리에 남게.
    const h1 = lines.findIndex((l, idx) => idx >= start && /^#\s/.test(l.trim()));
    const at = h1 >= 0 ? h1 + 1 : start;
    lines.splice(at, 0, '', header);
    return lines.join('\n');
}

/**
 * 브리핑 라벨 오타 후처리 (v2.2.288, 결정론) — 소형 로컬 모델이 구조 라벨을
 * 흘리는 사례('내 액점', '권 량', '회신_필요', '⚠ 이번 처리')를 코드가 교정한다.
 * 라벨(형식 토큰)만 손대고 본문 내용은 건드리지 않는다.
 */
export function polishBriefLabels(text: string): string {
    if (!text) return text;
    return text
        .replace(/내\s*액[점젼셩숀션]\s*[:：]/g, '내 액션:')
        .replace(/권\s*장?\s*기[한핸]\s*[:：]/g, '권장기한:')
        .replace(/권\s*량\s*[:：]/g, '권장기한:')
        .replace(/회신[_·]필요/g, '회신 필요')
        .replace(/결정[_·]필요/g, '결정 필요')
        .replace(/확인[_·]만/g, '확인만')
        .replace(/⚠\s*이번(?!\s*주)\s*처리/g, '⚠ 이번주 처리')
        .replace(/🔥\s*오늘(?!\s*처리)\s*처리?/g, '🔥 오늘 처리');
}

export function buildReplyDraftPrompt(mail: EmailForPrompt, instruction: string): string {
    const guide = instruction.trim()
        ? `[회신 지시사항 — 반드시 반영]\n${instruction.trim()}`
        : '[회신 지시사항 없음 — 원문에 답해야 할 질문/요청에 정중히 응답하는 기본 회신을 작성]';
    return `아래 수신 메일에 대한 **한국어 비즈니스 회신 초안**을 작성하라.

# 규칙
- 원문에 없는 사실·수치·약속을 만들지 말 것. 확답이 어려운 부분은 "확인 후 회신드리겠습니다" 형태로.
- 정중하되 간결한 비즈니스 문체. 인사 → 본문 → 맺음.
- 출력은 **회신 본문 텍스트만** — 제목·머리말·코드펜스·설명 금지. (서명/발송은 사용자가 Outlook 에서 직접)

${guide}

[수신 메일]
제목: ${mail.subject}
보낸사람: ${mail.from}
받은시각: ${mail.date}

${(mail.body || '').slice(0, 8000)}`;
}
