import type { Carrier } from '@/lib/enums/carrier';
import type { ShipmentStatus } from '@/lib/enums/shipment-status';
export type CarrierKind = Carrier;
export type { ShipmentStatus };

export interface CarrierTrackResult {
  status: ShipmentStatus;
  events: Array<{ at: Date; raw: unknown; description: string }>;
}
export interface CarrierWebhookResult {
  trackingNumber: string;
  status: ShipmentStatus;
  /** Stable idempotency key for carrier webhook dedup (provider event/delivery id). */
  eventId: string;
  raw: unknown;
}

export interface ResolvedAddress {
  lat: number;
  lon: number; // Wolt uses "lon" (not "lng")
  formattedAddress: string;
  contactName: string;
  contactPhone: string; // E.164 format
}

export interface ResolvedDropoffAddress extends ResolvedAddress {
  deliveryNote?: string;
}

export interface BuyLabelArgs {
  shipmentId: string;
  fromAddressId: string;
  toAddressId: string;
  insurance: boolean;
  resolvedPickup?: ResolvedAddress;
  resolvedDropoff?: ResolvedDropoffAddress;
}

export interface CarrierAdapter {
  kind: CarrierKind;
  capabilities: {
    canBuyLabel: boolean;
    hasTrackingApi: boolean;
    hasWebhook: boolean;
    supportsInsurance: boolean;
  };
  buyLabel(
    args: BuyLabelArgs,
  ): Promise<{ trackingNumber: string; labelR2Key: string; trackingUrl: string }>;
  track(trackingNumber: string): Promise<CarrierTrackResult>;
  verifyWebhook(req: Request): Promise<CarrierWebhookResult | null>;
}
