/**
 * 性能监控配置
 * @file performance-config.js
 * @description 性能监控系统的配置和集成
 */
const { performanceMonitor, events: perfEvents } = require('../utils/performance-monitor');
const { apiPerformanceMonitor, apiErrorMonitor } = require('../middleware/performance-middleware');
const logger = require('../utils/logger');

/**
 * 初始化性能监控系统
 * @param {Object} app Express应用实例
 * @param {Object} options 配置选项
 * @param {boolean} options.autoStart 是否自动启动监控
 * @param {number} options.interval 监控间隔（毫秒）
 * @param {Object} options.thresholds 警报阈值
 * @param {boolean} options.logToConsole 是否将性能日志输出到控制台
 * @returns {Object} 性能监控实例
 */
function initPerformanceMonitoring(app, options = {}) {
  const {
    autoStart = true,
    interval = 60000, // 默认1分钟
    thresholds = {},
    logToConsole = false
  } = options;
  
  // 设置警报阈值
  if (Object.keys(thresholds).length > 0) {
    performanceMonitor.setAlertThresholds(thresholds);
  }
  
  // 应用API性能监控中间件
  app.use(apiPerformanceMonitor);
  
  // 应用API错误监控中间件（应在路由之后应用）
  app.use(apiErrorMonitor);
  
  // 设置事件监听
  setupEventListeners(logToConsole);
  
  // 自动启动监控
  if (autoStart) {
    performanceMonitor.startMonitoring(interval);
    logger.info(`性能监控系统已自动启动，监控间隔: ${interval}ms`);
  }
  
  return performanceMonitor;
}

/**
 * 设置性能监控事件监听
 * @param {boolean} logToConsole 是否将性能日志输出到控制台
 */
function setupEventListeners(logToConsole = false) {
  // 监控启动事件
  perfEvents.on('monitoringStarted', (data) => {
    logger.info(`性能监控已启动，间隔: ${data.interval}ms`);
  });
  
  // 监控停止事件
  perfEvents.on('monitoringStopped', () => {
    logger.info('性能监控已停止');
  });
  
  // 数据库状态变化事件
  perfEvents.on('databaseStatus', (status) => {
    if (logToConsole) {
      logger.info('数据库状态更新:', status);
    }
  });
  
  // 数据库错误事件
  perfEvents.on('databaseError', (error) => {
    logger.error('数据库错误:', error);
  });
  
  // 慢查询事件
  perfEvents.on('slowQuery', (query) => {
    logger.warn(`检测到慢查询: ${query.duration}ms - ${query.query.substring(0, 100)}...`);
  });
  
  // API错误事件
  perfEvents.on('apiError', (data) => {
    logger.error(`API错误: ${data.method} ${data.path} - ${data.error}`);
  });
  
  // 慢API请求事件
  perfEvents.on('slowApiRequest', (data) => {
    logger.warn(`慢API请求: ${data.endpoint} - ${data.duration}ms (阈值: ${data.threshold}ms)`);
  });
  
  // 高CPU使用率事件
  perfEvents.on('highCpuUsage', (data) => {
    logger.warn(`高CPU使用率: ${data.usage}% (阈值: ${data.threshold}%)`);
  });
  
  // 高内存使用率事件
  perfEvents.on('highMemoryUsage', (data) => {
    logger.warn(`高内存使用率: ${data.usage}% (阈值: ${data.threshold}%)`);
  });
  
  // 高磁盘使用率事件
  perfEvents.on('highDiskUsage', (data) => {
    logger.warn(`高磁盘使用率: ${data.usage}% (阈值: ${data.threshold}%)`);
  });
}

/**
 * 获取性能监控路由
 * @returns {Object} Express路由
 */
function getPerformanceRoutes() {
  return require('../routes/performance-routes');
}

module.exports = {
  initPerformanceMonitoring,
  getPerformanceRoutes,
  performanceMonitor,
  perfEvents
};