/**
 * Coordinator Response Schema — Structured Output
 *
 * 强制 Coordinator 输出结构化 JSON，包含意图分类和简洁回答。
 * 通过 Anthropic API 的 output_config 实现硬约束。
 */

import { z } from 'zod';

export const CoordinatorResponseSchema = z.object({
  intent: z.enum([
    'factual_question',       // 直接事实问题："X的条件是什么"
    'yes_no_question',        // 是非判断问题："我能不能申请X"
    'comparison_question',    // 对比选择问题："A和B哪个好"
    'assessment_request',     // 评估请求："帮我评估一下"
    'objection_expression',   // 情绪/犹豫表达："太贵了"/"怕被拒"
    'detailed_consultation',  // 复杂政策咨询：明确要求详细了解
    'casual_chat',            // 闲聊/打招呼："你好"
  ]),
  answer: z.string().describe('直接回答用户的文本，简洁精准，默认100字以内'),
  followUp: z.string().optional().describe('直接对用户提出的跟进问题（必须以？结尾，必须是用户能看到的自然语言问题，禁止填写内部策略备注）'),
});

export type CoordinatorResponse = z.infer<typeof CoordinatorResponseSchema>;

// ============================================================
// Intent-based Answer Length Limits (中文字符数)
// ============================================================

/** 每种意图对应的最大 answer 长度（字符数）— 程序级硬约束 */
export const INTENT_MAX_ANSWER_LENGTH: Record<string, number> = {
  factual_question: 200,       // 1-3句，直接给答案
  yes_no_question: 120,        // 1-2句，结论+理由
  comparison_question: 250,    // 2-3句，推荐+理由
  assessment_request: 400,     // 按需但有上限
  objection_expression: 200,   // 共情+事实+引导
  detailed_consultation: 500,  // 复杂咨询允许较长
  casual_chat: 80,             // 1句
};

/** followUp 问题最大长度 */
export const MAX_FOLLOWUP_LENGTH = 80;

/**
 * 智能截断：在句子边界处截断，避免截断在句子中间
 */
export function smartTruncate(text: string, maxLen: number): string {
  if (text.length <= maxLen) return text;

  const truncated = text.substring(0, maxLen);

  // 在截断范围内找最后一个句子结束符
  const sentenceEnders = ['。', '！', '？', '；', '. ', '! ', '? '];
  let lastEnd = -1;
  for (const ender of sentenceEnders) {
    const idx = truncated.lastIndexOf(ender);
    if (idx > lastEnd) lastEnd = idx;
  }

  // 如果在后半段找到句子边界，在那里截断
  if (lastEnd > maxLen * 0.5) {
    return text.substring(0, lastEnd + 1);
  }

  // 没有好的边界，硬截断
  return truncated + '...';
}
