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

/**
 * 직전 assistant 답변의 *첫 1-2 문장* (= R1 결론) 을 추출해서 현재 턴의
 * system prompt 에 [PRIOR TURN CONCLUSION] 블록으로 주입한다.
 *
 * 왜 필요한가: 짧은 history (1-2 턴) 이라도 모델은 직전 *결론* 을 자기 추론의
 * 출발점으로 안 삼는 경우가 잦다 — 사용자가 "X 는 Y 의 개선판이야" 같은
 * 정정/보강을 던지면 직전 결론 ("ConnectAI 가 더 경험자 코드") 을 *재평가*
 * 해야 하는데, 그 결론이 무엇이었는지를 명시적으로 다시 보여줘야 모델이
 * 그것을 anchor 로 잡고 revise 한다. 단순 chat history 로는 모델이
 * "방금 무엇을 결론지었는지" 를 자기가 추출해야 해서 자주 놓친다.
 *
 * 추출 규칙: 마지막 assistant 메시지의 본문에서:
 *   - 첫 비어있지 않은 줄 한 줄 (한국어 문장 종결 "." / "다." / "요." / "음." 등)
 *   - 또는 첫 1-2 문장 (period/question mark 기준)
 *   - 240자 cap
 *
 * Returns '' when 첫 턴이거나 직전 assistant 메시지가 없을 때.
 */
export function buildPriorTurnConclusionContext(history: ChatMessage[]): string {
    const visible = history.filter(m => !m.internal && (m.role === 'user' || m.role === 'assistant'));
    const lastAssistant = [...visible].reverse().find(m => m.role === 'assistant');
    if (!lastAssistant || typeof lastAssistant.content !== 'string') return '';
    const conclusion = extractConclusion(lastAssistant.content);
    if (!conclusion) return '';
    return [
        '[PRIOR TURN CONCLUSION]',
        '직전 답변에서 내가 도달한 결론은 다음과 같다 (참고용 인용 — 받아쓰기 금지):',
        `> ${conclusion}`,
        // "…결론으로 다시 말해라" 문구는 소형 모델이 문자 그대로 해석해 위 인용문을
        // 답변 서두에 그대로 복창하는 앵무새 버그를 유발했다(턴마다 같은 첫 문장 반복).
        // 인용은 재평가의 *입력*일 뿐임을 명시하고 복창을 명시적으로 금지한다.
        '주의: 위 인용문을 답변 서두나 본문에 그대로 반복하지 마라. 이번 사용자 메시지가 이 결론의 전제·근거·범위를 바꾸는 정보라면 결론을 재평가해 *너 자신의 새로운 문장으로* 정정/보강하라. 영향이 없다면 인용문을 언급하지 말고 질문에 바로 답하라.',
    ].join('\n');
}

/**
 * 본문에서 *결론적인 첫 1-2 문장* 을 뽑는다. Plain-text 모드에서 시스템 프롬프트
 * R1 이 "첫 문장 = 결론" 을 강제하므로, 첫 문장이 거의 항상 그 턴의 verdict.
 *
 * 마크다운 헤더 / 빈 줄 / 백틱 펜스 skip. 240자에서 cut.
 */
function extractConclusion(text: string): string {
    // 마크다운 fence + 헤더 + 빈 줄 skip → 첫 의미 있는 줄.
    const lines = text.split('\n');
    let firstContent = '';
    let inFence = false;
    for (const raw of lines) {
        const line = raw.trim();
        if (!line) continue;
        if (line.startsWith('```')) { inFence = !inFence; continue; }
        if (inFence) continue;
        if (/^#+\s/.test(line)) continue; // markdown heading
        if (line.startsWith('---') || line.startsWith('===')) continue;
        firstContent = line;
        break;
    }
    if (!firstContent) return '';

    // 첫 1-2 문장 — period / question mark / 한국어 종결 기준.
    // 250자 안에서 첫 2개 문장 cut, 없으면 250자 cap.
    const cleaned = firstContent.replace(/\s+/g, ' ').trim();
    if (cleaned.length <= 240) return cleaned;

    // 마지막 문장 종결 위치 찾기 (240자 이내).
    const within = cleaned.slice(0, 240);
    const lastTerminator = Math.max(
        within.lastIndexOf('. '),
        within.lastIndexOf('.　'),
        within.lastIndexOf('? '),
        within.lastIndexOf('! '),
        within.lastIndexOf('다. '),
        within.lastIndexOf('요. '),
    );
    if (lastTerminator > 60) return within.slice(0, lastTerminator + 1);
    return within + '…';
}
