
import { useMemo } from 'react';
import { usePermission } from './usePermission';

/**
 * 상세 페이지 권한 설정 타입
 */
export interface DetailPermissionConfig {
  /** 수정 권한 오버라이드 (boolean 또는 함수) */
  canEdit?: boolean | (() => boolean);
  /** 삭제 권한 오버라이드 */
  canDelete?: boolean | (() => boolean);
  /** 등록 권한 오버라이드 */
  canCreate?: boolean | (() => boolean);
  /** 조회 권한 오버라이드 */
  canView?: boolean | (() => boolean);
  /** 승인 권한 오버라이드 */
  canApprove?: boolean | (() => boolean);
  /** 내보내기 권한 오버라이드 */
  canExport?: boolean | (() => boolean);
}

export interface UseDetailPermissionsOptions {
  /** 권한 설정 (config에서 전달) */
  config?: DetailPermissionConfig;
  /** 권한 체크할 URL 직접 지정 (다른 메뉴 권한 체크 시) */
  overrideUrl?: string;
}

export interface UseDetailPermissionsReturn {
  /** 조회 가능 여부 */
  canView: boolean;
  /** 등록 가능 여부 */
  canCreate: boolean;
  /** 수정 가능 여부 */
  canEdit: boolean;
  /** 삭제 가능 여부 */
  canDelete: boolean;
  /** 승인 가능 여부 */
  canApprove: boolean;
  /** 내보내기 가능 여부 */
  canExport: boolean;
  /** 권한 로딩 중 */
  isLoading: boolean;
}

/**
 * 권한 값 해석 헬퍼
 * - boolean: 그대로 반환
 * - function: 실행 결과 반환
 * - undefined: 기본값 반환
 */
function resolvePermission(
  configValue: boolean | (() => boolean) | undefined,
  defaultValue: boolean
): boolean {
  if (configValue === undefined) {
    return defaultValue;
  }
  if (typeof configValue === 'function') {
    return configValue();
  }
  return configValue;
}

/**
 * 상세 페이지 권한 통합 훅
 *
 * usePermission 훅을 래핑하여 config 기반 권한 오버라이드를 지원합니다.
 * IntegratedDetailTemplate과 함께 사용하거나 단독으로 사용 가능합니다.
 *
 * @example
 * ```tsx
 * // 기본 사용 (URL 기반 자동 권한)
 * const { canEdit, canDelete } = useDetailPermissions();
 *
 * // config 오버라이드
 * const { canEdit, canDelete } = useDetailPermissions({
 *   config: {
 *     canEdit: isOwner,           // boolean
 *     canDelete: () => isAdmin,   // function
 *   }
 * });
 *
 * // 다른 메뉴 권한 체크
 * const { canApprove } = useDetailPermissions({
 *   overrideUrl: '/approval/inbox'
 * });
 * ```
 */
export function useDetailPermissions(
  options: UseDetailPermissionsOptions = {}
): UseDetailPermissionsReturn {
  const { config, overrideUrl } = options;

  // 기본 권한 조회 (URL 기반)
  const basePermissions = usePermission(overrideUrl);

  // config 오버라이드 적용
  const permissions = useMemo(() => {
    return {
      canView: resolvePermission(config?.canView, basePermissions.canView),
      canCreate: resolvePermission(config?.canCreate, basePermissions.canCreate),
      canEdit: resolvePermission(config?.canEdit, basePermissions.canUpdate),
      canDelete: resolvePermission(config?.canDelete, basePermissions.canDelete),
      canApprove: resolvePermission(config?.canApprove, basePermissions.canApprove),
      canExport: resolvePermission(config?.canExport, basePermissions.canExport),
      isLoading: basePermissions.isLoading,
    };
  }, [config, basePermissions]);

  return permissions;
}
