export class OversoldError extends Error {
  override readonly name = 'OversoldError'
  readonly code = 'OVERSOLD' as const

  constructor(
    readonly skuId: string,
    readonly requested: number,
  ) {
    super(`oversold: sku ${skuId}, requested ${requested}`)
  }
}

export class InventoryValidationError extends Error {
  override readonly name = 'InventoryValidationError'
  readonly code = 'INVENTORY_VALIDATION' as const

  constructor(readonly field: string) {
    super(`inventory validation failed: ${field}`)
  }
}

export class InventoryItemNotFoundError extends Error {
  override readonly name = 'InventoryItemNotFoundError'
  readonly code = 'INVENTORY_ITEM_NOT_FOUND' as const

  constructor(readonly skuId: string) {
    super(`inventory item not found: ${skuId}`)
  }
}

export function isOversoldError(e: unknown): e is OversoldError {
  return (
    typeof e === 'object' &&
    e !== null &&
    (e as { name?: unknown }).name === 'OversoldError' &&
    (e as { code?: unknown }).code === 'OVERSOLD'
  )
}

export function isInventoryValidationError(e: unknown): e is InventoryValidationError {
  return (
    typeof e === 'object' &&
    e !== null &&
    (e as { name?: unknown }).name === 'InventoryValidationError' &&
    (e as { code?: unknown }).code === 'INVENTORY_VALIDATION'
  )
}

export function isInventoryItemNotFoundError(e: unknown): e is InventoryItemNotFoundError {
  return (
    typeof e === 'object' &&
    e !== null &&
    (e as { name?: unknown }).name === 'InventoryItemNotFoundError' &&
    (e as { code?: unknown }).code === 'INVENTORY_ITEM_NOT_FOUND'
  )
}
