import { BadRequestException } from '@nestjs/common';

import { FREIGHT_TYPES, FreightType } from './entities/booking.entity';
import { BookingFreightShapeInput } from './dto/validators/booking-freight.validator';

/** Normalize and validate booking freight shape (used on create and after update merge). */
export function assertFreightShape(input: BookingFreightShapeInput): void {
  if (!input.freightType || !FREIGHT_TYPES.includes(input.freightType as FreightType)) {
    throw new BadRequestException(
      `freightType is required and must be one of: ${FREIGHT_TYPES.join(', ')}`,
    );
  }
  //

  const containers = input.containers ?? [];
  const hasContainers = containers.length > 0;
  const hasCargoType = Boolean(input.cargoTypeId);

  if (input.freightType === 'BULK') {
    if (hasContainers) {
      throw new BadRequestException(
        'BULK freight cannot include container lines; use cargoTypeId only',
      );
    }
    if (!hasCargoType) {
      throw new BadRequestException('cargoTypeId is required for BULK freight');
    }
    return;
  }

  if (hasCargoType) {
    throw new BadRequestException('cargoTypeId is not allowed for CONTAINER freight');
  }
  if (!hasContainers) {
    throw new BadRequestException(
      'CONTAINER freight requires at least one container line with containerTypeId',
    );
  }
  for (const line of containers) {
    if (!line.containerTypeId) {
      throw new BadRequestException('Each container line must include containerTypeId');
    }
  }
}
