const jwt = require('jsonwebtoken');

/**
 * JWT 토큰 인증 미들웨어
 * 요청 헤더에서 토큰을 추출하고 검증
 */
exports.authenticateJWT = (req, res, next) => {
  try {
    // 헤더에서 토큰 가져오기
    const authHeader = req.headers.authorization;
    
    if (!authHeader || !authHeader.startsWith('Bearer ')) {
      return res.status(401).json({ message: '인증 토큰이 필요합니다.' });
    }
    
    const token = authHeader.split(' ')[1];
    
    // 토큰 검증
    const decoded = jwt.verify(token, process.env.JWT_SECRET);
    
    // 요청 객체에 사용자 정보 추가
    req.user = decoded;
    
    next();
  } catch (error) {
    console.error('인증 오류:', error);
    res.status(401).json({ message: '유효하지 않은 토큰입니다.' });
  }
};

/**
 * 역할 기반 권한 부여 미들웨어
 * 특정 역할을 가진 사용자만 접근 허용
 * @param {string[]} roles - 허용된 역할 목록
 */
exports.authorizeRoles = (...roles) => {
  return (req, res, next) => {
    if (!req.user) {
      return res.status(401).json({ message: '인증이 필요합니다.' });
    }
    
    if (!roles.includes(req.user.role)) {
      return res.status(403).json({ message: '이 작업을 수행할 권한이 없습니다.' });
    }
    
    next();
  };
};
