/**
 * API统一中间件
 * 处理所有API请求的统一格式和错误处理
 */

const { buildSuccessResponse, buildErrorResponse, handlePagination, handleFilters, handleSorting } = require('../config/api-config');

/**
 * API请求统一处理中间件
 * @param {Object} req - Express请求对象
 * @param {Object} res - Express响应对象
 * @param {Function} next - 下一个中间件
 */
const apiMiddleware = (req, res, next) => {
  // 记录请求日志
  console.log(`[API] ${req.method} ${req.originalUrl}`, {
    query: req.query,
    body: req.body,
    params: req.params
  });

  // 添加统一的响应方法
  res.apiSuccess = (data = null, message = '操作成功', options = {}) => {
    buildSuccessResponse(res, data, message, options);
  };

  res.apiError = (message = '操作失败', code = 'UNKNOWN_ERROR', statusCode = 500) => {
    buildErrorResponse(res, message, code, statusCode);
  };

  // 添加分页处理方法
  req.getPagination = () => handlePagination(req);

  // 添加筛选条件处理方法
  req.getFilters = (allowedFields = []) => handleFilters(req, allowedFields);

  // 添加排序处理方法
  req.getSorting = (allowedFields = []) => handleSorting(req, allowedFields);

  next();
};

/**
 * 统一错误处理中间件
 * @param {Error} err - 错误对象
 * @param {Object} req - 请求对象
 * @param {Object} res - 响应对象
 * @param {Function} next - 下一个中间件
 */
const errorHandler = (err, req, res, next) => {
  console.error('[API Error]', {
    message: err.message,
    stack: err.stack,
    url: req.url,
    method: req.method,
    body: req.body,
    query: req.query
  });

  // Sequelize数据库错误
  if (err.name && err.name.includes('Sequelize')) {
    return res.apiError('数据库操作失败', 'DATABASE_ERROR', 500);
  }

  // 验证错误
  if (err.name === 'ValidationError') {
    return res.apiError('数据验证失败', 'VALIDATION_ERROR', 400);
  }

  // JWT认证错误
  if (err.name === 'JsonWebTokenError') {
    return res.apiError('Token无效', 'INVALID_TOKEN', 401);
  }

  if (err.name === 'TokenExpiredError') {
    return res.apiError('Token已过期', 'TOKEN_EXPIRED', 401);
  }

  // 默认错误处理
  res.apiError(
    process.env.NODE_ENV === 'development' ? err.message : '服务器内部错误',
    'INTERNAL_ERROR',
    500
  );
};

/**
 * 404处理中间件
 * @param {Object} req - 请求对象
 * @param {Object} res - 响应对象
 * @param {Function} next - 下一个中间件
 */
const notFoundHandler = (req, res, next) => {
  res.apiError('接口不存在', 'NOT_FOUND', 404);
};

module.exports = {
  apiMiddleware,
  errorHandler,
  notFoundHandler
};