#!/usr/bin/env node
/**
 * 等待 Vite 开发服务器启动的脚本
 * 从配置文件读取端口，并等待服务器就绪
 * 如果配置端口被占用，Vite 会自动尝试下一个端口，此脚本会检测实际使用的端口
 */

const path = require('path');
const http = require('http');

// 获取配置文件
const configPath = path.join(__dirname, 'config.js');
const config = require(configPath);

const startPort = config.vite?.port || 5173;
const viteHost = config.vite?.host || 'localhost';
const maxWaitTime = 20; // 最多等待 20 秒
const maxPortAttempts = 10; // 最多尝试 10 个连续端口
const checkInterval = 500; // 每 500ms 检查一次

/**
 * 检查指定端口是否有 Vite 服务器响应
 * 不仅检查端口是否响应，还要确认是 Vite 服务器（通过检查响应头）
 */
function checkPort(port) {
  return new Promise((resolve) => {
    const req = http.get(`http://${viteHost}:${port}`, (res) => {
      // 检查状态码
      if (res.statusCode !== 200) {
        resolve(false);
        return;
      }
      
      // 读取响应数据以确认是否是 Vite 服务器
      let data = '';
      let resolved = false;
      
      res.on('data', (chunk) => {
        if (resolved) return;
        data += chunk.toString();
        // 如果响应包含 Vite 的特征（如 vite/client 或 Vite），确认是 Vite 服务器
        if (data.length > 100 && (data.includes('/vite') || data.includes('Vite') || data.includes('vite/client'))) {
          resolved = true;
          resolve(true);
        }
      });
      
      res.on('end', () => {
        if (resolved) return;
        // 如果响应结束，检查是否包含 Vite 特征
        // Vite 的 HTML 通常包含 vite/client 或类似的引用
        if (data.includes('/vite') || data.includes('Vite') || data.includes('vite/client')) {
          resolve(true);
        } else {
          resolve(false);
        }
      });
    });
    
    req.on('error', () => {
      resolve(false);
    });
    
    req.setTimeout(2000, () => {
      req.destroy();
      resolve(false);
    });
  });
}

/**
 * 查找 Vite 实际使用的端口
 */
async function findVitePort() {
  // 从配置的端口开始，尝试最多 maxPortAttempts 个连续端口
  for (let offset = 0; offset < maxPortAttempts; offset++) {
    const port = startPort + offset;
    const isReady = await checkPort(port);
    if (isReady) {
      return port;
    }
  }
  return null;
}

async function waitForServer() {
  console.log(`Waiting for Vite dev server (starting from port ${startPort})...`);
  
  const startTime = Date.now();
  let lastFoundPort = null;
  let consecutiveChecks = 0;
  
  while (Date.now() - startTime < maxWaitTime * 1000) {
    const port = await findVitePort();
    if (port) {
      // 如果找到的端口和上次一样，连续检查几次确保稳定
      if (port === lastFoundPort) {
        consecutiveChecks++;
        if (consecutiveChecks >= 3) {
          // 连续3次检查到同一个端口，确认服务器稳定运行
          console.log(`\n[OK] Vite dev server is ready at http://${viteHost}:${port}`);
          process.exit(0);
        }
      } else {
        // 端口变化了，重置计数器
        lastFoundPort = port;
        consecutiveChecks = 1;
      }
    } else {
      // 没找到服务器，重置计数器
      lastFoundPort = null;
      consecutiveChecks = 0;
    }
    
    // 显示进度
    process.stdout.write('.');
    await new Promise(resolve => setTimeout(resolve, checkInterval));
  }
  
  console.log(`\n[ERROR] Vite dev server did not start within ${maxWaitTime} seconds`);
  process.exit(1);
}

waitForServer();
