/**
 * System prompt 의 *조립 단계* 에서 일어나는 두 가지 stateless 변환:
 *
 *   1) stripAstraFormattingForAgentMode — Agent Mode v3 에서 Astra 기본 시스템
 *      프롬프트의 *포맷/페르소나/스탠스* 섹션을 제거. 에이전트 자체 프롬프트와
 *      섹션 헤더가 충돌해 모델이 두 톤을 섞어 답하는 회귀를 막는다.
 *   2) computeModeSignature — agent/company/multi/brain 4개 축을 한 문자열로
 *      직렬화. 직전 signature 와 다르면 system prompt 에 "이전 모드 X → 현재 Y"
 *      한 줄 bridge 를 끼울 수 있다.
 *
 * 둘 다 instance state 의존 없는 pure transform — agent.ts 의 private 메서드를
 * 그대로 추출.
 */

/**
 * Agent Mode 진입 시 Astra 기본 프롬프트에서 다음 섹션들을 정규식으로 제거:
 *   - Astra 페르소나 소개 → "specialized AI assistant" 로 대체
 *   - [OUTPUT FORMAT] (## 요약/상세/제안 포맷 지시)
 *   - [FOLLOW-UP QUESTION RULES]
 *   - [ENGINEERING STANCE] (Astra 전용 응답 스타일)
 *   - [NO EMOJIS - ABSOLUTE RULE] (에이전트 프롬프트에 이모지가 정당히 포함될 수 있음)
 * 유지: [CORE BEHAVIOR], [LOCAL PATH RULE], [STRICT GLOBAL RULES], [ACTION TAGS], [OPERATIONAL RULES]
 *
 * 마지막에 빈 줄 4개 이상 → 2개로 정리 (섹션 제거 후 남는 깨진 간격 수정).
 */
export function stripAstraFormattingForAgentMode(prompt: string): string {
    let stripped = prompt;

    stripped = stripped.replace(
        /You are Astra, a Jarvis-style local project operating assistant\.\s*\nIf the user asks your name, say you are Astra\.\s*\n/,
        'You are a specialized AI assistant operating in Agent Mode.\n',
    );

    stripped = stripped.replace(
        /\[OUTPUT FORMAT\][\s\S]*?(?=\[FOLLOW-UP QUESTION RULES\]|\[ENGINEERING STANCE\]|\[ACTION TAGS\])/,
        '',
    );

    stripped = stripped.replace(
        /\[FOLLOW-UP QUESTION RULES\][\s\S]*?(?=\[ENGINEERING STANCE\]|\[ACTION TAGS\])/,
        '',
    );

    stripped = stripped.replace(
        /\[ENGINEERING STANCE\][\s\S]*?(?=\[ACTION TAGS\])/,
        '',
    );

    stripped = stripped.replace(
        /1\. \[NO EMOJIS - ABSOLUTE RULE\][^\n]*\n/,
        '',
    );

    stripped = stripped.replace(/\n{4,}/g, '\n\n');

    return stripped;
}

/**
 * v2.2.69 — 현재 요청의 mode signature 를 단일 문자열로 직렬화. 직전 signature 와
 * 다르면 호출자가 system prompt 에 "이전 모드: X / 현재 모드: Y" 한 줄 bridge 를
 * 끼울 수 있다. 4개 축 (agent/company/multi/brain) 의 변화만 추적 — 변경 빈도가
 * 낮아 cache key 로도 충분.
 */
export function computeModeSignature(opts: {
    agentSkillName?: string;
    companyMode?: boolean;
    multiAgent?: boolean;
    brainName?: string;
}): string {
    const parts = [
        `agent=${opts.agentSkillName || 'none'}`,
        `company=${opts.companyMode ? 'on' : 'off'}`,
        `multi=${opts.multiAgent ? 'on' : 'off'}`,
        `brain=${opts.brainName || '?'}`,
    ];
    return parts.join('|');
}
