/**
 * Devil Agent — 직전 답변에 대한 반박 생성기.
 *
 * 동작:
 *   1. agent.ts 가 main turn 완료 직후 호출
 *   2. 같은 model/engine 으로 *별도 LLM call 1회* — 짧은 비판 한 문단 생성
 *   3. 결과를 webview 로 'devilRebuttal' message 로 send
 *   4. 실패 / 비활성 시 silent skip — main 답변에는 영향 없음
 *
 * 비용:
 *   - 매 turn 마다 LLM 1회 추가. 사용자가 settings 에서 명시적 ON 했을 때만.
 *   - 짧은 prompt + maxTokens 350 으로 제한 → 일반 turn 비용의 ~10-15%.
 */

import * as vscode from 'vscode';
import { buildDevilSystemPrompt, buildDevilUserPrompt, DevilPromptInput, DEVIL_PERSONA_NAME } from './devilPrompt';

const SETTING_KEY = 'g1nation.devilAgent.enabled';

export function isDevilAgentEnabled(): boolean {
    const cfg = vscode.workspace.getConfiguration('g1nation');
    return !!cfg.get<boolean>('devilAgent.enabled', false);
}

export async function setDevilAgentEnabled(enabled: boolean): Promise<void> {
    const cfg = vscode.workspace.getConfiguration('g1nation');
    await cfg.update('devilAgent.enabled', enabled, vscode.ConfigurationTarget.Global);
}

export { DEVIL_PERSONA_NAME, SETTING_KEY };

/**
 * Main turn 끝나면 caller (agent.ts) 가 이 함수를 호출.
 * - input 에 사용자 질문 + 직전 답변 + (선택) brain context 전달
 * - 반환값: 도현의 반박 텍스트 또는 null (비활성·실패 시)
 *
 * 호출자가 webview 에 직접 'devilRebuttal' message 를 보내도록 분리 — 본 함수는 *pure*.
 */
export async function generateDevilRebuttal(
    callLLM: (system: string, userMessage: string, maxTokens: number) => Promise<string>,
    input: DevilPromptInput,
): Promise<string | null> {
    if (!isDevilAgentEnabled()) return null;
    try {
        const system = buildDevilSystemPrompt();
        const userMsg = buildDevilUserPrompt(input);
        const out = await callLLM(system, userMsg, 350);
        const cleaned = (out || '').trim();
        if (!cleaned) return null;
        // 환각 가드: 통계 / 수치 패턴이 보이면 *(근거: 추론)* 로 강제 변경 — 도현이 환각 자신 가질 가능성 줄임.
        return _appendSourceTagIfMissing(cleaned);
    } catch {
        return null;
    }
}

function _appendSourceTagIfMissing(text: string): string {
    if (/\(근거:/.test(text)) return text;
    return text.trim() + '\n\n(근거: 추론)';
}
