/**
 * 권한 체크 유틸리티
 * 3단계 권한 체계: SUPER_ADMIN / COMPANY_ADMIN / USER
 */

import { PersonBean } from "../types/auth";

/**
 * 권한 레벨 Enum
 */
export enum PermissionLevel {
  SUPER_ADMIN = "SUPER_ADMIN", // 최고 관리자 (전체 시스템)
  COMPANY_ADMIN = "COMPANY_ADMIN", // 회사 관리자 (자기 회사만)
  USER = "USER", // 일반 사용자
}

/**
 * 사용자가 슈퍼관리자인지 확인
 * @param user 사용자 정보
 * @returns 슈퍼관리자 여부
 */
export function isSuperAdmin(user?: PersonBean | null): boolean {
  if (!user) return false;
  return user.companyCode === "*" && user.userType === "SUPER_ADMIN";
}

/**
 * 사용자가 회사 관리자인지 확인 (슈퍼관리자 제외)
 * @param user 사용자 정보
 * @returns 회사 관리자 여부
 */
export function isCompanyAdmin(user?: PersonBean | null): boolean {
  if (!user) return false;
  return user.userType === "COMPANY_ADMIN" && user.companyCode !== "*";
}

/**
 * 사용자가 관리자인지 확인 (슈퍼관리자 + 회사관리자)
 * @param user 사용자 정보
 * @returns 관리자 여부
 */
export function isAdmin(user?: PersonBean | null): boolean {
  return isSuperAdmin(user) || isCompanyAdmin(user);
}

/**
 * 사용자가 일반 사용자인지 확인
 * @param user 사용자 정보
 * @returns 일반 사용자 여부
 */
export function isRegularUser(user?: PersonBean | null): boolean {
  if (!user) return false;
  return (
    user.userType === "USER" ||
    user.userType === "GUEST" ||
    user.userType === "PARTNER"
  );
}

/**
 * 사용자의 권한 레벨 반환
 * @param user 사용자 정보
 * @returns 권한 레벨
 */
export function getUserPermissionLevel(
  user?: PersonBean | null
): PermissionLevel | null {
  if (!user) return null;

  if (isSuperAdmin(user)) {
    return PermissionLevel.SUPER_ADMIN;
  }

  if (isCompanyAdmin(user)) {
    return PermissionLevel.COMPANY_ADMIN;
  }

  return PermissionLevel.USER;
}

/**
 * DDL 실행 권한 확인 (슈퍼관리자만)
 * @param user 사용자 정보
 * @returns DDL 실행 가능 여부
 */
export function canExecuteDDL(user?: PersonBean | null): boolean {
  return isSuperAdmin(user);
}

/**
 * 회사 데이터 접근 권한 확인
 * @param user 사용자 정보
 * @param targetCompanyCode 접근하려는 회사 코드
 * @returns 접근 가능 여부
 */
export function canAccessCompanyData(
  user?: PersonBean | null,
  targetCompanyCode?: string
): boolean {
  if (!user) return false;

  // 슈퍼관리자는 모든 회사 데이터 접근 가능
  if (isSuperAdmin(user)) {
    return true;
  }

  // 자기 회사 데이터만 접근 가능
  return user.companyCode === targetCompanyCode;
}

/**
 * 사용자 관리 권한 확인 (관리자만)
 * @param user 사용자 정보
 * @param targetCompanyCode 관리하려는 회사 코드
 * @returns 사용자 관리 가능 여부
 */
export function canManageUsers(
  user?: PersonBean | null,
  targetCompanyCode?: string
): boolean {
  if (!user) return false;

  // 슈퍼관리자는 모든 회사 사용자 관리 가능
  if (isSuperAdmin(user)) {
    return true;
  }

  // 회사 관리자는 자기 회사 사용자만 관리 가능
  if (isCompanyAdmin(user)) {
    return user.companyCode === targetCompanyCode;
  }

  return false;
}

/**
 * 회사 설정 변경 권한 확인 (관리자만)
 * @param user 사용자 정보
 * @param targetCompanyCode 설정 변경하려는 회사 코드
 * @returns 설정 변경 가능 여부
 */
export function canManageCompanySettings(
  user?: PersonBean | null,
  targetCompanyCode?: string
): boolean {
  return canManageUsers(user, targetCompanyCode);
}

/**
 * 회사 생성/삭제 권한 확인 (슈퍼관리자만)
 * @param user 사용자 정보
 * @returns 회사 생성/삭제 가능 여부
 */
export function canManageCompanies(user?: PersonBean | null): boolean {
  return isSuperAdmin(user);
}

/**
 * 시스템 설정 변경 권한 확인 (슈퍼관리자만)
 * @param user 사용자 정보
 * @returns 시스템 설정 변경 가능 여부
 */
export function canManageSystemSettings(user?: PersonBean | null): boolean {
  return isSuperAdmin(user);
}

/**
 * 권한 에러 메시지 생성
 * @param requiredLevel 필요한 권한 레벨
 * @returns 에러 메시지
 */
export function getPermissionErrorMessage(
  requiredLevel: PermissionLevel
): string {
  const messages: Record<PermissionLevel, string> = {
    [PermissionLevel.SUPER_ADMIN]:
      "최고 관리자 권한이 필요합니다. 전체 시스템을 관리할 수 있는 권한이 없습니다.",
    [PermissionLevel.COMPANY_ADMIN]:
      "관리자 권한이 필요합니다. 회사 관리자 이상의 권한이 필요합니다.",
    [PermissionLevel.USER]: "인증된 사용자 권한이 필요합니다.",
  };

  return messages[requiredLevel] || "권한이 부족합니다.";
}

/**
 * 권한 부족 에러 객체 생성
 * @param requiredLevel 필요한 권한 레벨
 * @returns 에러 응답 객체
 */
export function createPermissionError(requiredLevel: PermissionLevel) {
  return {
    success: false,
    error: {
      code: "INSUFFICIENT_PERMISSION",
      details: getPermissionErrorMessage(requiredLevel),
    },
  };
}

/**
 * 사용자 권한 정보 요약
 * @param user 사용자 정보
 * @returns 권한 정보 객체
 */
export function getUserPermissionSummary(user?: PersonBean | null) {
  if (!user) {
    return {
      level: null,
      isSuperAdmin: false,
      isCompanyAdmin: false,
      isAdmin: false,
      canExecuteDDL: false,
      canManageUsers: false,
      canManageCompanies: false,
      canManageSystemSettings: false,
    };
  }

  return {
    level: getUserPermissionLevel(user),
    isSuperAdmin: isSuperAdmin(user),
    isCompanyAdmin: isCompanyAdmin(user),
    isAdmin: isAdmin(user),
    canExecuteDDL: canExecuteDDL(user),
    canManageUsers: isAdmin(user),
    canManageCompanies: canManageCompanies(user),
    canManageSystemSettings: canManageSystemSettings(user),
  };
}
