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

import { BookingPricingService } from '../modules/bookings/booking-pricing.service';
import { Booking } from '../modules/bookings/entities/booking.entity';
import { PriceLineItemDto } from '../modules/bookings/dto/generate-price-response.dto';

export interface PricingScheduleRow {
  label: string;
  description: string;
  amount: number;
  currency: string;
}

export interface PricingSchedule {
  lineItems: PricingScheduleRow[];
  surcharges: PricingScheduleRow[];
  totalAmount: number;
  currency: string;
  equipmentReturn?: string;
  originLabel: string;
  destinationLabel: string;
  containerLines: Array<{
    label: string;
    quantity: number;
    vgmPerUnitTons: number;
  }>;
}

@Injectable()
export class ContractPricingScheduleBuilder {
  constructor(private readonly pricingService: BookingPricingService) {}

  async build(booking: Booking): Promise<PricingSchedule> {
    const { lineItems, totalAmount, currency } =
      await this.pricingService.computeContractLineItems(booking);

    const isSurcharge = (l: PriceLineItemDto) =>
      l.code.includes('SURCHARGE') || l.description.toLowerCase().includes('surcharge');

    const baseLines = lineItems.filter((l) => !isSurcharge(l));
    const surchargeLines = lineItems.filter(isSurcharge);

    return {
      lineItems: baseLines.map((l) => ({
        label: l.code,
        description: l.description,
        amount: l.amount,
        currency: l.currency,
      })),
      surcharges: surchargeLines.map((l) => ({
        label: l.code,
        description: l.description,
        amount: l.amount,
        currency: l.currency,
      })),
      totalAmount,
      currency,
      equipmentReturn: booking.equipmentReturn ?? '—',
      originLabel: booking.originYard?.label ?? booking.originYard?.code ?? '—',
      destinationLabel:
        booking.destinationYard?.label ?? booking.destinationYard?.code ?? '—',
      containerLines: (booking.bookingContainers ?? []).map((c) => ({
        label:
          c.containerType?.label ??
          c.containerType?.code ??
          c.containerTypeId ??
          '—',
        quantity: c.quantity,
        vgmPerUnitTons: Number(c.vgmPerUnitTons),
      })),
    };
  }
}
