/**
 * 性能监控路由
 * @file performance-routes.js
 * @description 提供性能监控数据的API路由
 */
const express = require('express');
const router = express.Router();
const { performanceMonitor } = require('../utils/performance-monitor');
const { apiPerformanceMonitor, apiErrorMonitor } = require('../middleware/performance-middleware');
const logger = require('../utils/logger');

// 应用性能监控中间件到所有路由
router.use(apiPerformanceMonitor);

/**
 * @api {get} /api/performance/metrics 获取所有性能指标
 * @apiName GetAllMetrics
 * @apiGroup Performance
 * @apiDescription 获取系统、数据库和API的所有性能指标
 * @apiSuccess {Object} metrics 所有性能指标数据
 */
router.get('/metrics', async (req, res) => {
  try {
    const metrics = await performanceMonitor.getAllMetrics();
    res.json(metrics);
  } catch (error) {
    logger.error('获取性能指标失败:', error);
    res.status(500).json({ error: '获取性能指标失败', message: error.message });
  }
});

/**
 * @api {get} /api/performance/system 获取系统资源指标
 * @apiName GetSystemMetrics
 * @apiGroup Performance
 * @apiDescription 获取CPU、内存和磁盘使用情况
 * @apiSuccess {Object} metrics 系统资源指标数据
 */
router.get('/system', (req, res) => {
  try {
    const metrics = performanceMonitor.getSystemMetrics();
    res.json(metrics);
  } catch (error) {
    logger.error('获取系统资源指标失败:', error);
    res.status(500).json({ error: '获取系统资源指标失败', message: error.message });
  }
});

/**
 * @api {get} /api/performance/database 获取数据库性能指标
 * @apiName GetDatabaseMetrics
 * @apiGroup Performance
 * @apiDescription 获取数据库连接池状态、慢查询和查询模式统计
 * @apiSuccess {Object} metrics 数据库性能指标数据
 */
router.get('/database', async (req, res) => {
  try {
    const metrics = await performanceMonitor.getDatabaseMetrics();
    res.json(metrics);
  } catch (error) {
    logger.error('获取数据库性能指标失败:', error);
    res.status(500).json({ error: '获取数据库性能指标失败', message: error.message });
  }
});

/**
 * @api {get} /api/performance/api 获取API性能指标
 * @apiName GetApiMetrics
 * @apiGroup Performance
 * @apiDescription 获取API请求统计、响应时间和错误率
 * @apiSuccess {Object} metrics API性能指标数据
 */
router.get('/api', (req, res) => {
  try {
    const metrics = performanceMonitor.getApiStats();
    res.json(metrics);
  } catch (error) {
    logger.error('获取API性能指标失败:', error);
    res.status(500).json({ error: '获取API性能指标失败', message: error.message });
  }
});

/**
 * @api {post} /api/performance/start 启动性能监控
 * @apiName StartMonitoring
 * @apiGroup Performance
 * @apiDescription 启动系统性能监控
 * @apiParam {Number} [interval] 监控间隔（毫秒）
 * @apiSuccess {Object} result 操作结果
 */
router.post('/start', (req, res) => {
  try {
    const interval = req.body.interval;
    const result = performanceMonitor.startMonitoring(interval);
    res.json(result);
  } catch (error) {
    logger.error('启动性能监控失败:', error);
    res.status(500).json({ error: '启动性能监控失败', message: error.message });
  }
});

/**
 * @api {post} /api/performance/stop 停止性能监控
 * @apiName StopMonitoring
 * @apiGroup Performance
 * @apiDescription 停止系统性能监控
 * @apiSuccess {Object} result 操作结果
 */
router.post('/stop', (req, res) => {
  try {
    const result = performanceMonitor.stopMonitoring();
    res.json(result);
  } catch (error) {
    logger.error('停止性能监控失败:', error);
    res.status(500).json({ error: '停止性能监控失败', message: error.message });
  }
});

/**
 * @api {get} /api/performance/status 获取监控状态
 * @apiName GetMonitoringStatus
 * @apiGroup Performance
 * @apiDescription 获取当前性能监控的状态
 * @apiSuccess {Object} status 监控状态
 */
router.get('/status', (req, res) => {
  try {
    const status = performanceMonitor.getMonitoringStatus();
    res.json(status);
  } catch (error) {
    logger.error('获取监控状态失败:', error);
    res.status(500).json({ error: '获取监控状态失败', message: error.message });
  }
});

/**
 * @api {post} /api/performance/thresholds 设置警报阈值
 * @apiName SetAlertThresholds
 * @apiGroup Performance
 * @apiDescription 设置性能监控的警报阈值
 * @apiParam {Object} thresholds 警报阈值配置
 * @apiSuccess {Object} result 操作结果
 */
router.post('/thresholds', (req, res) => {
  try {
    const thresholds = req.body;
    const result = performanceMonitor.setAlertThresholds(thresholds);
    res.json(result);
  } catch (error) {
    logger.error('设置警报阈值失败:', error);
    res.status(500).json({ error: '设置警报阈值失败', message: error.message });
  }
});

/**
 * @api {get} /api/performance/thresholds 获取警报阈值
 * @apiName GetAlertThresholds
 * @apiGroup Performance
 * @apiDescription 获取当前设置的警报阈值
 * @apiSuccess {Object} thresholds 警报阈值配置
 */
router.get('/thresholds', (req, res) => {
  try {
    const thresholds = performanceMonitor.getAlertThresholds();
    res.json(thresholds);
  } catch (error) {
    logger.error('获取警报阈值失败:', error);
    res.status(500).json({ error: '获取警报阈值失败', message: error.message });
  }
});

/**
 * @api {post} /api/performance/api/reset 重置API统计
 * @apiName ResetApiStats
 * @apiGroup Performance
 * @apiDescription 重置API性能统计数据
 * @apiSuccess {Object} result 操作结果
 */
router.post('/api/reset', (req, res) => {
  try {
    const result = performanceMonitor.resetApiStats();
    res.json(result);
  } catch (error) {
    logger.error('重置API统计失败:', error);
    res.status(500).json({ error: '重置API统计失败', message: error.message });
  }
});

// 应用错误处理中间件
router.use(apiErrorMonitor);

module.exports = router;