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

  constructor(
    readonly tenantId: string,
    readonly itemId: string,
    readonly locationId: string,
    readonly requestedQty: number,
  ) {
    super(
      `oversold: tenant ${tenantId}, item ${itemId}, location ${locationId}, requested ${requestedQty}`,
    )
  }
}

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 ItemNotFoundError extends Error {
  override readonly name = 'ItemNotFoundError'
  readonly code = 'ITEM_NOT_FOUND' as const

  constructor(
    readonly tenantId: string,
    readonly itemId: string,
  ) {
    super(`inventory item not found: tenant ${tenantId}, item ${itemId}`)
  }
}

export class LocationNotFoundError extends Error {
  override readonly name = 'LocationNotFoundError'
  readonly code = 'LOCATION_NOT_FOUND' as const

  constructor(
    readonly tenantId: string,
    readonly locationId: string,
  ) {
    super(`inventory location not found: tenant ${tenantId}, location ${locationId}`)
  }
}

export class MovementNotFoundError extends Error {
  override readonly name = 'MovementNotFoundError'
  readonly code = 'MOVEMENT_NOT_FOUND' as const

  constructor(
    readonly tenantId: string,
    readonly holderRef: string,
  ) {
    super(`inventory movement not found: tenant ${tenantId}, holderRef ${holderRef}`)
  }
}

export class InventoryTransactionRequiredError extends Error {
  override readonly name = 'InventoryTransactionRequiredError'
  readonly code = 'INVENTORY_TRANSACTION_REQUIRED' as const

  constructor() {
    super('inventory transaction support required')
  }
}

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 isItemNotFoundError(e: unknown): e is ItemNotFoundError {
  return (
    typeof e === 'object' &&
    e !== null &&
    (e as { name?: unknown }).name === 'ItemNotFoundError' &&
    (e as { code?: unknown }).code === 'ITEM_NOT_FOUND'
  )
}

export function isLocationNotFoundError(e: unknown): e is LocationNotFoundError {
  return (
    typeof e === 'object' &&
    e !== null &&
    (e as { name?: unknown }).name === 'LocationNotFoundError' &&
    (e as { code?: unknown }).code === 'LOCATION_NOT_FOUND'
  )
}

export function isMovementNotFoundError(e: unknown): e is MovementNotFoundError {
  return (
    typeof e === 'object' &&
    e !== null &&
    (e as { name?: unknown }).name === 'MovementNotFoundError' &&
    (e as { code?: unknown }).code === 'MOVEMENT_NOT_FOUND'
  )
}

export function isInventoryTransactionRequiredError(
  e: unknown,
): e is InventoryTransactionRequiredError {
  return (
    typeof e === 'object' &&
    e !== null &&
    (e as { name?: unknown }).name === 'InventoryTransactionRequiredError' &&
    (e as { code?: unknown }).code === 'INVENTORY_TRANSACTION_REQUIRED'
  )
}
