/**
 * 持续聊天测试
 * 运行后可以在终端输入消息与 Agent 对话
 * 支持多行输入：连续按两次回车结束输入
 */

const { Framework } = require('../src');
const readline = require('readline');
require('dotenv').config();

async function main() {
  console.log('=== Foliko 持续聊天测试 ===\n');
  console.log('输入消息与 Agent 对话，输入 exit 或 quit 退出');
  console.log('多行输入：按两次回车结束，或输入 !! 立即结束\n');

  // 创建框架
  const framework = new Framework({ debug: false });

  // Bootstrap
  await framework.bootstrap({
    agentDir: './.agent',
    aiConfig: {
      provider: 'minimax',
      model: 'MiniMax-M2.7',
      baseURL: 'https://api.minimaxi.com/v1',
      apiKey: process.env.MINIMAX_API_KEY,
    },
  });

  console.log('框架已就绪\n');

  // 创建 Agent
  const agent = framework.createAgent({
    name: 'TestAgent',
    systemPrompt: '你是一个有帮助的助手，擅长回答问题和执行任务。',
    sharedPrompt: '工作目录: {{WORK_DIR}}',
    metadata: {
      projectName: 'Foliko',
      version: '1.0.0',
    },
  });

  // 创建命令行界面
  const rl = readline.createInterface({
    input: process.stdin,
    output: process.stdout,
  });

  // 多行输入函数
  const readMultiline = () => {
    return new Promise((resolve) => {
      const lines = [];

      const question = () => {
        rl.question(lines.length === 0 ? '> ' : '- ', (input) => {
          // 输入 !! 立即结束
          if (input.trim() === '!!') {
            const result = lines.join('\n').trim();
            resolve(result);
            return;
          }
          // 空行结束输入
          if (input.trim() === '') {
            const result = lines.join('\n').trim();
            resolve(result);
            return;
          }
          lines.push(input);
          question();
        });
      };
      question();
    });
  };

  // 提问函数
  const ask = async (question) => {
    try {
      console.log('\n[Agent 思考中...]\n');

      // 使用流式响应
      let fullResponse = '';
      for await (const chunk of agent.chatStream(question)) {
        if (chunk.type === 'text') {
          process.stdout.write(chunk.text);
          fullResponse += chunk.text;
        } else if (chunk.type === 'tool-call') {
          console.log('\n\n[工具调用]', chunk.toolName);
        } else if (chunk.type === 'tool-result') {
          console.log('\n[工具结果]', JSON.stringify(chunk.result).substring(0, 100));
        } else if (chunk.type === 'error') {
          console.error('\n[错误]', chunk.error);
        }
      }

      console.log('\n');
      return fullResponse;
    } catch (err) {
      console.error('\n[错误]', err.message);
      return '';
    }
  };

  // 欢迎消息
  console.log('Agent: 你好！有什么可以帮助你的吗？\n');

  // 初始任务：让 LLM 注册一个测试路由
  console.log('\n[系统] 指示 Agent 注册一个 GET /test 路由，返回 "1232432"\n');
  await ask(
    '请帮我注册一个 GET 路由：\n- 路径：/test\n- 处理函数：return "1232432"\n\n注册完成后，用 web_request 工具测试访问这个路由，确认返回 "1232432"'
  );

  console.log('\n--- 测试完成，现在你可以继续对话 ---\n');

  // 主循环
  const promptUser = async () => {
    const input = await readMultiline();
    const trimmed = input.trim();

    if (trimmed.toLowerCase() === 'exit' || trimmed.toLowerCase() === 'quit') {
      console.log('\n再见！');
      await framework.destroy();
      rl.close();
      return;
    }

    if (trimmed) {
      await ask(trimmed);
    }

    promptUser();
  };

  promptUser();
}

main().catch(console.error);
