import {
  isOrderChargeConflictError,
  isOrderIdempotencyConflictError,
  isOrderIntegrityError,
  isOrderNotChargeableError,
  isOrderNotFoundError,
  isOrderValidationError,
  isRefundExceedsPaidError,
  isImmutableFieldError,
} from '@platform-modules/commerce-orders'

/** Thrown when an orders hook is used outside <OrdersProvider> (§5). */
export class OrdersProviderError extends Error {
  override readonly name = 'OrdersProviderError'
  constructor(hook: string) {
    super(`${hook} must be used within <OrdersProvider>`)
  }
}
export function isOrdersProviderError(e: unknown): e is OrdersProviderError {
  return typeof e === 'object' && e !== null && (e as { name?: string }).name === 'OrdersProviderError'
}

/** Thrown by reviveOrder/reviveOrderPage on malformed serialized wire input (§3). */
export class OrderWireError extends Error {
  override readonly name = 'OrderWireError'
  constructor(message: string) {
    super(message)
  }
}
export function isOrderWireError(e: unknown): e is OrderWireError {
  return typeof e === 'object' && e !== null && (e as { name?: string }).name === 'OrderWireError'
}

// Re-export the core's structural guards so consumers branch on error kind without instanceof (§4).
export {
  isOrderChargeConflictError,
  isOrderIdempotencyConflictError,
  isOrderIntegrityError,
  isOrderNotChargeableError,
  isOrderNotFoundError,
  isOrderValidationError,
  isRefundExceedsPaidError,
  isImmutableFieldError,
}
