import {
  DocumentDpi,
  DocumentTemplate,
  getDocuments,
  GetDocumentsRequest,
} from '@shipengine/connect-runtime';
import { LabelPackage } from './models/labels/label-package';
import { CreateLabelRequest } from './requests';
import { CreateLabelResponse } from './responses';

export const getCustoms = async (
  carrierName: string,
  request: CreateLabelRequest | GetDocumentsRequest,
): Promise<CreateLabelResponse> => {
  const requestWithCarrierName: GetDocumentsRequest = Object.assign(
    { document_dpi: DocumentDpi.Dpi_203 },
    request,
    { carrier_name: carrierName, metadata: { carrier_code: 'customs' } },
  );

  return await getDocuments(requestWithCarrierName, <DocumentTemplate>{ api_code: 'customs' });
};

export const combineDocuments = (
  labelsResponse: CreateLabelResponse,
  customsResponse: CreateLabelResponse,
): CreateLabelResponse => {
  if (customsResponse?.documents) {
    //concat documents
    labelsResponse.documents = labelsResponse?.documents?.concat(customsResponse?.documents);
    const mergeByTrackingNumber = (
      labelPackages: LabelPackage[],
      customsPackages: LabelPackage[],
    ) =>
      labelPackages.map((labels) => {
        const customs = customsPackages.find(
          (customs) => labels.tracking_number === customs.tracking_number,
        );
        if (customs?.documents) {
          labels.documents = labels.documents?.concat(customs.documents);
        }
        return labels;
      });
    if (labelsResponse.packages && customsResponse.packages)
      labelsResponse.packages = mergeByTrackingNumber(
        labelsResponse.packages,
        customsResponse.packages,
      );
  }
  return labelsResponse;
};
