const io = require('socket.io-client');
const axios = require('axios');

// 配置
const GAME_SERVER = 'http://localhost:3000';
const TEST_USER = {
  username: 'angtest123',
  password: 'angtest123',
  email: 'angjustinl@163.com'
};

/**
 * 登录游戏服务器获取token
 */
async function loginToGameServer() {
  console.log('📝 步骤 1: 登录游戏服务器');
  console.log(`   用户名: ${TEST_USER.username}`);
  
  try {
    const response = await axios.post(`${GAME_SERVER}/auth/login`, {
      identifier: TEST_USER.username,
      password: TEST_USER.password
    });
    
    if (response.data.success) {
      console.log('✅ 登录成功');
      console.log(`   用户ID: ${response.data.data.user.id}`);
      console.log(`   昵称: ${response.data.data.user.nickname}`);
      console.log(`   邮箱: ${response.data.data.user.email}`);
      console.log(`   Token: ${response.data.data.access_token.substring(0, 20)}...`);
      return {
        userId: response.data.data.user.id,
        username: response.data.data.user.username,
        token: response.data.data.access_token
      };
    } else {
      throw new Error(response.data.message || '登录失败');
    }
  } catch (error) {
    console.error('❌ 登录失败:', error.response?.data?.message || error.message);
    throw error;
  }
}

// 使用用户 API Key 测试 Zulip 集成
async function testWithUserApiKey() {
  console.log('🚀 开始测试用户 API Key 的 Zulip 集成');
  console.log('='.repeat(60));
  
  try {
    // 登录获取 token
    const userInfo = await loginToGameServer();
    
    console.log('\n📡 步骤 2: 连接 WebSocket 并测试 Zulip 集成');
    console.log(`   连接到: ${GAME_SERVER}/game`);
  
    const socket = io(`${GAME_SERVER}/game`, {
      transports: ['websocket'],
      timeout: 20000
    });
    
    let testStep = 0;
    
    socket.on('connect', () => {
      console.log('✅ WebSocket 连接成功');
      testStep = 1;
      
      // 使用真实的 JWT token
      const loginMessage = {
        type: 'login',
        token: userInfo.token
      };
      
      console.log('📤 步骤 3: 发送登录消息（使用 JWT Token）');
      socket.emit('login', loginMessage);
    });
  
    socket.on('login_success', (data) => {
      console.log('✅ 步骤 3 完成: 登录成功');
      console.log('   会话ID:', data.sessionId);
      console.log('   用户ID:', data.userId);
      console.log('   用户名:', data.username);
      console.log('   当前地图:', data.currentMap);
      testStep = 2;
      
      // 等待 Zulip 客户端初始化
      console.log('\n⏳ 等待 3 秒让 Zulip 客户端初始化...');
      setTimeout(() => {
        const chatMessage = {
          t: 'chat',
          content: `🎮 【用户API Key测试】来自 ${userInfo.username} 的消息！\n` +
                  `时间: ${new Date().toLocaleString()}\n` +
                  `使用真实 API Key 发送此消息。`,
          scope: 'local'
        };
        
        console.log('📤 步骤 4: 发送消息到 Zulip（使用真实 API Key）');
        console.log('   目标 Stream: Whale Port');
        socket.emit('chat', chatMessage);
      }, 3000);
    });
  
    socket.on('chat_sent', (data) => {
      console.log('✅ 步骤 4 完成: 消息发送成功');
      console.log('   响应:', JSON.stringify(data, null, 2));
      
      // 只在第一次收到 chat_sent 时发送第二条消息
      if (testStep === 2) {
        testStep = 3;
        
        setTimeout(() => {
          // 先切换到 Pumpkin Valley 地图
          console.log('\n📤 步骤 5: 切换到 Pumpkin Valley 地图');
          const positionUpdate = {
            t: 'position',
            x: 150,
            y: 400,
            mapId: 'pumpkin_valley'
          };
          socket.emit('position_update', positionUpdate);
          
          // 等待位置更新后发送消息
          setTimeout(() => {
            const chatMessage2 = {
              t: 'chat',
              content: '🎃 在南瓜谷发送的测试消息！',
              scope: 'local'
            };
            
            console.log('📤 步骤 6: 在 Pumpkin Valley 发送消息');
            socket.emit('chat', chatMessage2);
          }, 1000);
        }, 2000);
      }
    });
  
    socket.on('chat_render', (data) => {
      console.log('\n📨 收到来自 Zulip 的消息:');
      console.log('   发送者:', data.from);
      console.log('   内容:', data.txt);
      console.log('   Stream:', data.stream || '未知');
      console.log('   Topic:', data.topic || '未知');
    });
    
    socket.on('error', (error) => {
      console.log('❌ 收到错误:', JSON.stringify(error, null, 2));
    });
    
    socket.on('disconnect', () => {
      console.log('\n🔌 WebSocket 连接已关闭');
      console.log('\n' + '='.repeat(60));
      console.log('📊 测试结果汇总');
      console.log('='.repeat(60));
      console.log('   完成步骤:', testStep, '/ 3');
      if (testStep >= 3) {
        console.log('   ✅ 核心功能正常！');
        console.log('   💡 请检查 Zulip 中的 "Whale Port" 和 "Pumpkin Valley" Streams 查看消息');
      } else {
        console.log('   ⚠️  部分测试未完成');
      }
      console.log('='.repeat(60));
      process.exit(testStep >= 3 ? 0 : 1);
    });
    
    socket.on('connect_error', (error) => {
      console.error('❌ 连接错误:', error.message);
      process.exit(1);
    });
    
    // 20秒后自动关闭（给足够时间完成测试）
    setTimeout(() => {
      console.log('\n⏰ 测试时间到，关闭连接');
      socket.disconnect();
    }, 20000);
    
  } catch (error) {
    console.error('\n❌ 测试失败:', error.message);
    process.exit(1);
  }
}

// 运行测试
testWithUserApiKey();