// utils/access.js - 유틸리티 함수만 남김 (미들웨어 제거)
const ACCESS_LEVELS = {
  worker: 1,
  group_leader: 2, 
  support_team: 3,
  admin: 4,
  system: 5
};

const ACCESS_LEVEL_NAMES = {
  worker: '작업자',
  group_leader: '그룹장',
  support_team: '지원팀', 
  admin: '관리자',
  system: '시스템'
};

/**
 * 권한 레벨 비교 (유틸리티 함수)
 * @param {string} userLevel - 사용자의 권한 레벨
 * @param {string} requiredLevel - 필요한 권한 레벨
 * @returns {boolean} - 권한 여부
 */
const hasPermission = (userLevel, requiredLevel) => {
  const userOrder = ACCESS_LEVELS[userLevel] || 0;
  const requiredOrder = ACCESS_LEVELS[requiredLevel] || 999;
  return userOrder >= requiredOrder;
};

/**
 * 권한 레벨을 숫자로 변환
 * @param {string} level - 권한 레벨 문자열
 * @returns {number} - 권한 레벨 숫자
 */
const getLevelNumber = (level) => {
  return ACCESS_LEVELS[level] || 0;
};

/**
 * 권한 레벨을 한글명으로 변환
 * @param {string} level - 권한 레벨 문자열
 * @returns {string} - 한글 권한명
 */
const getLevelName = (level) => {
  return ACCESS_LEVEL_NAMES[level] || '알 수 없음';
};

/**
 * 사용자가 특정 권한들 중 하나라도 가지고 있는지 확인
 * @param {string} userLevel - 사용자의 권한 레벨
 * @param {string[]} allowedLevels - 허용된 권한 레벨들
 * @returns {boolean} - 권한 여부
 */
const hasAnyPermission = (userLevel, allowedLevels) => {
  return allowedLevels.some(level => hasPermission(userLevel, level));
};

/**
 * 모든 권한 레벨 목록 반환
 * @returns {string[]} - 권한 레벨 배열
 */
const getAllLevels = () => {
  return Object.keys(ACCESS_LEVELS);
};

/**
 * 특정 권한 레벨 이상의 모든 권한 반환
 * @param {string} minLevel - 최소 권한 레벨
 * @returns {string[]} - 해당 레벨 이상의 권한들
 */
const getLevelsAbove = (minLevel) => {
  const minOrder = ACCESS_LEVELS[minLevel] || 0;
  return Object.keys(ACCESS_LEVELS).filter(level => ACCESS_LEVELS[level] >= minOrder);
};

// ===== 프론트엔드용 권한 체크 함수들 =====

/**
 * 페이지 접근 권한 체크 (프론트엔드에서 사용)
 * @param {string} userLevel - 사용자 권한
 * @param {object} pageConfig - 페이지 설정 {minLevel?, allowedRoles?, deniedRoles?}
 * @returns {boolean} - 접근 가능 여부
 */
const canAccessPage = (userLevel, pageConfig) => {
  const { minLevel, allowedRoles, deniedRoles = [] } = pageConfig;
  
  // 거부 목록 체크
  if (deniedRoles.includes(userLevel)) {
    return false;
  }
  
  // 허용 목록 체크
  if (allowedRoles && allowedRoles.length > 0) {
    return allowedRoles.includes(userLevel);
  }
  
  // 최소 레벨 체크
  if (minLevel) {
    return hasPermission(userLevel, minLevel);
  }
  
  return true;
};

/**
 * CRUD 권한 체크 (프론트엔드에서 사용)
 * @param {string} userLevel - 사용자 권한
 * @param {string} table - 테이블명
 * @param {string} action - 액션 (CREATE, READ, UPDATE, DELETE)
 * @returns {boolean} - 권한 여부
 */
const canPerformAction = (userLevel, table, action) => {
  // 기본적으로 모든 인증된 사용자에게 권한 부여
  // 특별한 제한이 필요한 경우에만 여기서 체크
  
  // 예시: 사용자 관리는 admin 이상만
  if (table === 'Users' && ['CREATE', 'UPDATE', 'DELETE'].includes(action)) {
    return hasPermission(userLevel, 'admin');
  }
  
  // 예시: 시스템 테이블은 system만
  if (table === 'SystemConfig') {
    return hasPermission(userLevel, 'system');
  }
  
  // 나머지는 모든 인증된 사용자에게 허용
  return userLevel && userLevel !== 'anonymous';
};

module.exports = {
  // 기본 유틸리티 함수들
  hasPermission,
  getLevelNumber,
  getLevelName,
  hasAnyPermission,
  getAllLevels,
  getLevelsAbove,
  
  // 프론트엔드용 함수들
  canAccessPage,
  canPerformAction,
  
  // 상수들
  ACCESS_LEVELS,
  ACCESS_LEVEL_NAMES
};