import axios from 'axios';
import logger from './logger';
import { getStoreValue } from '../store.js';

/**
 * 检测网络连接是否正常
 * @param {string} url - 要检测的URL，如果不提供则使用默认的客户端地址
 * @param {number} timeout - 超时时间，默认5秒
 * @returns {Promise<boolean>} - 返回网络连接状态
 */
export async function checkNetworkConnection(url = null, timeout = 5000) {
  try {
    // 如果没有提供URL，则使用存储的客户端地址
    if (!url) {
      const h5ClientUrl = getStoreValue("h5_client_url");
      if (!h5ClientUrl) {
        logger.warn('网络检测：未找到客户端地址配置');
        return false;
      }
      url = h5ClientUrl;
    }

    logger.info(`网络检测：开始检测 ${url} 的连接状态`);

    // 发送HEAD请求检测网络连接
    const response = await axios.head(url, {
      timeout: timeout,
      validateStatus: function (status) {
        // 接受2xx和3xx的状态码
        return status >= 200 && status < 400;
      }
    });

    logger.info(`网络检测：连接成功，状态码 ${response.status}`);
    return true;

  } catch (error) {
    logger.warn(`网络检测：连接失败 - ${error.message}`);
    
    // 如果是超时错误，记录更详细的信息
    if (error.code === 'ECONNABORTED') {
      logger.warn(`网络检测：请求超时 (${timeout}ms)`);
    } else if (error.code === 'ENOTFOUND') {
      logger.warn('网络检测：无法解析主机名');
    } else if (error.code === 'ECONNREFUSED') {
      logger.warn('网络检测：连接被拒绝');
    }
    
    return false;
  }
}

/**
 * 检测多个URL的网络连接
 * @param {Array<string>} urls - 要检测的URL数组
 * @param {number} timeout - 超时时间，默认5秒
 * @returns {Promise<Object>} - 返回每个URL的检测结果
 */
export async function checkMultipleNetworkConnections(urls, timeout = 5000) {
  const results = {};
  
  for (const url of urls) {
    results[url] = await checkNetworkConnection(url, timeout);
  }
  
  return results;
}

/**
 * 检测默认客户端地址的网络连接
 * @param {number} timeout - 超时时间，默认5秒
 * @returns {Promise<boolean>} - 返回网络连接状态
 */
export async function checkDefaultClientConnection(timeout = 5000) {
  return await checkNetworkConnection(null, timeout);
} 