import type { Order, OrderLine } from '@platform-modules/commerce-orders'
import type { TransactionalDatabase } from '@platform-modules/db'
import type { FulfillmentDbSchema } from './schema.js'
import type {
  Address,
  CarrierTrackResult,
  CarrierWebhookResult,
  FulfillmentNotification,
  Label,
} from './types.js'

export interface StorageAdapter {
  put(key: string, body: Uint8Array | ArrayBuffer): Promise<void>
  signedUrl(
    key: string,
    ttlSeconds: number,
  ): Promise<{ url: string; expiresAt?: Date }>
}

export interface CarrierCapabilities {
  webhooks: boolean
  tracking: boolean
}

export interface BuyLabelArgs {
  shipmentId: string
  address: Address
  idempotencyKey: string
}

export interface CarrierAdapter {
  kind: string
  capabilities: CarrierCapabilities
  buyLabel(args: BuyLabelArgs): Promise<Label>
  track(trackingNumber: string): Promise<CarrierTrackResult>
  verifyWebhook(req: Request): Promise<CarrierWebhookResult | null>
}

export interface FulfillmentPorts {
  db: TransactionalDatabase<FulfillmentDbSchema>
  storage: StorageAdapter
  notify(notification: FulfillmentNotification): Promise<void>
  resolveBlobKey(line: OrderLine): Promise<string>
  resolveShippingAddress(order: Order): Promise<Address>
  carriers?(kind: string): CarrierAdapter | undefined
}
