/**
 * 多模型大纲生成对比测试
 * 使用book.id=1的信息,用不同厂商的模型生成大纲
 */

import { callLLMWithMessages } from './src/services/llm/index.js';

// 测试的模型列表(不同厂商)
const TEST_MODELS = [
  { id: 'MiniMax-M2.7', vendor: 'MiniMax', desc: 'MiniMax M2.7 (默认)' },
  { id: 'qwen3.6-plus', vendor: '阿里云', desc: '通义千问 3.6 Plus' },
  { id: 'qwen3.5-122b-a10b', vendor: '阿里云', desc: '通义千问 3.5 (122B)' },
  { id: 'doubao-seed-2.0-code', vendor: '火山引擎', desc: '豆包 Seed 2.0' },
];

// 提示词(与系统一致)
const OUTLINE_SYSTEM_PROMPT = `你是一位专业的图书策划编辑，擅长为各类主题设计清晰、严谨、有逻辑递进的书籍大纲。

## 你的职责
根据用户提供的书名、类型和主题，设计一份完整的书籍大纲，包含章节列表。

## 工作要求
1. 章数必须在配置的章节范围内
2. 章之间有清晰的逻辑递进关系（由浅入深、由理论到实践等）
3. 每章的知识点要具体，不能泛泛而谈
4. **动态分配每章字数**：核心章节多分配，次要章节少分配，总和≈全书总字数范围中值

## 输出格式
必须返回 JSON，不要包含任何 markdown 代码块标记：
{
  "mainTheme": "主题一句话描述",
  "structureLogic": "章节组织逻辑说明",
  "chapters": [
    {
      "number": 1,
      "title": "章标题",
      "summary": "本章概述（2-3句话）",
      "keyPoints": ["知识点1", "知识点2"],
      "estimatedWords": 10000
    }
  ]
}`;

async function testModelOutline(model, topic, bookScale) {
  console.log(`\n${'='.repeat(80)}`);
  console.log(`测试模型: ${model.desc}`);
  console.log(`${'='.repeat(80)}`);
  
  const messages = [
    { role: 'system', content: OUTLINE_SYSTEM_PROMPT },
    {
      role: 'user',
      content: `书名：《${topic}》\n规模：大学专业教材\n章节范围：10-12章\n\n请生成完整的书籍大纲，只包含章节列表（不含节和小节）。`,
    },
  ];

  try {
    const startTime = Date.now();
    const response = await callLLMWithMessages(messages, model.id);
    const duration = ((Date.now() - startTime) / 1000).toFixed(2);
    
    console.log(`\n⏱️  耗时: ${duration}秒`);
    console.log(`\n📝 生成的大纲:\n`);
    console.log(response);
    console.log(`\n${'-'.repeat(80)}`);
    
    // 尝试解析JSON
    try {
      let jsonStr = response.trim();
      const match = jsonStr.match(/\{[\s\S]*\}/);
      if (match) jsonStr = match[0];
      
      const outline = JSON.parse(jsonStr);
      console.log(`\n✅ JSON解析成功`);
      console.log(`📊 章节数: ${outline.chapters?.length || 0}`);
      console.log(`📖 主题: ${outline.mainTheme}`);
      console.log(`🔗 逻辑: ${outline.structureLogic}`);
      
      // 分析章节分布
      if (outline.chapters) {
        const totalWords = outline.chapters.reduce((sum, c) => sum + (c.estimatedWords || 0), 0);
        console.log(`📈 总字数: ${totalWords}`);
        console.log(`📊 平均每章: ${Math.round(totalWords / outline.chapters.length)}字`);
        
        // 检查章节分布
        console.log(`\n章节列表:`);
        outline.chapters.forEach(ch => {
          console.log(`  ${ch.number}. ${ch.title} (${ch.estimatedWords}字)`);
        });
      }
    } catch (e) {
      console.log(`\n❌ JSON解析失败: ${e.message}`);
    }
    
    return { model: model.desc, response, success: true, duration };
  } catch (error) {
    console.log(`\n❌ 生成失败: ${error.message}`);
    return { model: model.desc, error: error.message, success: false };
  }
}

async function main() {
  console.log('🚀 开始多模型大纲生成对比测试\n');
  
  // book.id=1的信息(操作系统教材)
  const TOPIC = '操作系统引论';
  const BOOK_SCALE = '大学专业教材';
  
  console.log(`📚 书籍主题: ${TOPIC}`);
  console.log(`📏 书籍类型: ${BOOK_SCALE}`);
  console.log(`🔢 测试模型数: ${TEST_MODELS.length}`);
  
  const results = [];
  
  for (const model of TEST_MODELS) {
    const result = await testModelOutline(model, TOPIC, BOOK_SCALE);
    results.push(result);
    
    // 等待一下避免限流
    await new Promise(resolve => setTimeout(resolve, 2000));
  }
  
  // 输出总结
  console.log(`\n\n${'='.repeat(80)}`);
  console.log('📊 测试结果汇总');
  console.log(`${'='.repeat(80)}\n`);
  
  results.forEach((r, i) => {
    console.log(`${i + 1}. ${r.model}`);
    if (r.success) {
      console.log(`   ✅ 成功 | 耗时: ${r.duration}秒`);
    } else {
      console.log(`   ❌ 失败: ${r.error}`);
    }
    console.log();
  });
  
  console.log('测试完成！');
}

main().catch(console.error);
