/**
 * SearchRatesPort (API Port - Input)
 *
 * Defines the interface for searching shipping rates
 * This is the entry point for the rate search use case
 */

import { RateQuote } from '../../entities/rate-quote.entity';

export interface RateSearchInput {
  origin: string; // Port code (UN/LOCODE)
  destination: string; // Port code (UN/LOCODE)
  containerType: string; // e.g., '20DRY', '40HC'
  mode: 'FCL' | 'LCL';
  departureDate: Date;
  quantity?: number; // Number of containers (default: 1)
  weight?: number; // For LCL (kg)
  volume?: number; // For LCL (CBM)
  isHazmat?: boolean;
  imoClass?: string; // If hazmat
  carrierPreferences?: string[]; // Specific carrier codes to query
}

export interface RateSearchOutput {
  quotes: RateQuote[];
  searchId: string;
  searchedAt: Date;
  totalResults: number;
  carrierResults: {
    carrierName: string;
    status: 'success' | 'error' | 'timeout';
    resultCount: number;
    errorMessage?: string;
  }[];
}

export interface SearchRatesPort {
  /**
   * Execute rate search across multiple carriers
   * @param input - Rate search parameters
   * @returns Rate quotes from available carriers
   */
  execute(input: RateSearchInput): Promise<RateSearchOutput>;
}
