const jwt = require('jsonwebtoken');
const Admin = require('../models/admin');
const UserMySQL = require('../models/UserMySQL');
const { AppError } = require('../utils/errors');

// 用户认证中间件
async function authenticateUser(req, res, next) {
  try {
    // 从请求头获取token
    const authHeader = req.headers.authorization;
    if (!authHeader || !authHeader.startsWith('Bearer ')) {
      throw new AppError('未提供认证token', 401);
    }

    const token = authHeader.split(' ')[1];

    // 验证token
    const decoded = jwt.verify(token, process.env.JWT_SECRET || 'your-secret-key');
    
    // 查找用户
    const user = await UserMySQL.findById(decoded.userId);
    if (!user) {
      throw new AppError('用户不存在', 401);
    }

    // 检查用户状态
    if (!UserMySQL.isActive(user)) {
      throw new AppError('账户已被禁用', 403);
    }

    // 将用户信息添加到请求对象
    req.user = UserMySQL.sanitize(user);
    req.userId = decoded.userId; // 同时设置userId，保持与现有控制器的兼容性

    next();
  } catch (error) {
    if (error.name === 'JsonWebTokenError') {
      throw new AppError('无效的认证token', 401);
    }
    
    if (error.name === 'TokenExpiredError') {
      throw new AppError('认证token已过期', 401);
    }

    next(error);
  }
}

// 管理员认证中间件
async function authenticateAdmin(req, res, next) {
  try {
    // 从请求头获取token
    const authHeader = req.headers.authorization;
    if (!authHeader || !authHeader.startsWith('Bearer ')) {
      return res.status(401).json({
        success: false,
        code: 401,
        message: '未提供认证token'
      });
    }

    const token = authHeader.split(' ')[1];

    // 验证token
    const decoded = jwt.verify(token, process.env.JWT_SECRET || 'admin-secret-key');
    
    // 查找管理员
    const admin = await Admin.findById(decoded.id);
    if (!admin) {
      return res.status(401).json({
        success: false,
        code: 401,
        message: '管理员不存在'
      });
    }

    // 检查管理员状态
    if (admin.status !== 1) {
      return res.status(401).json({
        success: false,
        code: 401,
        message: '管理员账号已被禁用'
      });
    }

    // 将管理员信息添加到请求对象
    req.admin = admin;

    next();
  } catch (error) {
    if (error.name === 'JsonWebTokenError') {
      return res.status(401).json({
        success: false,
        code: 401,
        message: '无效的认证token'
      });
    }
    
    if (error.name === 'TokenExpiredError') {
      return res.status(401).json({
        success: false,
        code: 401,
        message: '认证token已过期'
      });
    }

    next(error);
  }
}

// 权限检查中间件
function requireRole(roles) {
  return (req, res, next) => {
    if (!req.admin) {
      return res.status(401).json({
        success: false,
        code: 401,
        message: '需要管理员权限'
      });
    }

    if (!roles.includes(req.admin.role)) {
      return res.status(403).json({
        success: false,
        code: 403,
        message: '权限不足'
      });
    }

    next();
  };
}

module.exports = {
  authenticateUser,
  authenticateAdmin,
  requireRole
};
