import type { ChatMessage } from '../../agent';

/**
 * v2.2.69 — sliding-window 가 잘라낸 메시지들을 한 줄 요약으로 압축.
 *
 * 추가 LLM 호출 없이 heuristic 으로:
 *   - 사용자 prompt 첫 문장
 *   - assistant 답변 첫 문장 (conclusion-first 가정 — R1)
 * 만 추출해 시간순으로 이어붙인다. 모델이 "이전에 무슨 얘기를 했는지" 의
 * 골자만 알면 충분하다.
 *
 * 너무 많으면 가장 오래된 절반은 한 줄로 합치고 최근 8개만 보존 — 요약 자체가
 * 컨텍스트를 다시 차지하면 본말전도.
 *
 * Stateless — agent.ts 의 private 메서드를 그대로 추출. instance state 의존
 * 없고 외부 호출 없음. 테스트 용이성 + god-file 무게 줄이기 위해 분리.
 */
export function buildDroppedHistorySummary(dropped: ChatMessage[]): string {
    if (dropped.length === 0) return '';
    const lines: string[] = [];
    let userTurnIdx = 0;
    for (const msg of dropped) {
        if (msg.internal) continue;
        const content = typeof msg.content === 'string' ? msg.content : '';
        if (!content.trim()) continue;
        if (msg.role === 'user') {
            userTurnIdx++;
            lines.push(`U${userTurnIdx}: ${firstSentence(content)}`);
        } else if (msg.role === 'assistant') {
            lines.push(`A${userTurnIdx}: ${firstSentence(content)}`);
        }
    }
    const MAX_LINES = 8;
    if (lines.length > MAX_LINES) {
        const tail = lines.slice(-MAX_LINES);
        const head = lines.slice(0, lines.length - MAX_LINES);
        return `[이전 대화 요약 — 총 ${dropped.length}개 메시지가 컨텍스트 한계로 생략됨]\n(더 오래된 ${head.length}개 턴 생략됨)\n${tail.join('\n')}`;
    }
    return `[이전 대화 요약 — 총 ${dropped.length}개 메시지가 컨텍스트 한계로 생략됨]\n${lines.join('\n')}`;
}

function firstSentence(s: string): string {
    const cleaned = String(s || '')
        .replace(/^\s{0,3}#{1,6}\s+/gm, '')
        .replace(/\*\*/g, '')
        .replace(/`{3}[\s\S]*?`{3}/g, '[code]')
        .replace(/\s+/g, ' ')
        .trim();
    const m = cleaned.match(/^[^.!?。\n]{1,140}[.!?。]?/);
    const out = (m ? m[0] : cleaned.slice(0, 140)).trim();
    return out;
}
