export class EntitlementTierError extends Error {
  override readonly name = 'EntitlementTierError'
  readonly code = 'ENTITLEMENT_TIER' as const

  constructor(readonly tier: string) {
    super(`unknown entitlement tier: ${tier}`)
  }
}

export class EntitlementFeatureError extends Error {
  override readonly name = 'EntitlementFeatureError'
  readonly code = 'ENTITLEMENT_FEATURE' as const

  constructor(
    readonly tier: string,
    readonly feature: string,
  ) {
    super(`unknown entitlement feature: ${tier}:${feature}`)
  }
}

export type EntitlementError = EntitlementTierError | EntitlementFeatureError

export function isEntitlementTierError(error: unknown): error is EntitlementTierError {
  return (
    typeof error === 'object' &&
    error !== null &&
    (error as { name?: unknown }).name === 'EntitlementTierError' &&
    (error as { code?: unknown }).code === 'ENTITLEMENT_TIER'
  )
}

export function isEntitlementFeatureError(error: unknown): error is EntitlementFeatureError {
  return (
    typeof error === 'object' &&
    error !== null &&
    (error as { name?: unknown }).name === 'EntitlementFeatureError' &&
    (error as { code?: unknown }).code === 'ENTITLEMENT_FEATURE'
  )
}

export function isEntitlementError(error: unknown): error is EntitlementError {
  return isEntitlementTierError(error) || isEntitlementFeatureError(error)
}
