import { ApiProperty } from '@nestjs/swagger';

export class FreightVolumePointDto {
  @ApiProperty({ example: 'May', description: 'Short month label' })
  month!: string;

  @ApiProperty({ example: 940, description: 'Tonnage shipped in the month' })
  tonnes!: number;
}

export class FreightVolumeDto {
  @ApiProperty({ example: 4180, description: 'Total tonnage shipped year-to-date' })
  totalTonnes!: number;

  @ApiProperty({ example: 1240000, description: 'Total committed freight value year-to-date' })
  totalValue!: number;

  @ApiProperty({ example: 'ETB' })
  currency!: string;

  @ApiProperty({ example: 16, description: 'Tonnage change vs same period last year, in percent' })
  ytdChangePct!: number;

  @ApiProperty({ type: [FreightVolumePointDto], description: 'Monthly tonnage series (oldest first, last 6 months)' })
  monthly!: FreightVolumePointDto[];
}

/**
 * KPIs for the portal dashboard (MyPortalPage), aggregated from the current
 * user's company bookings. All figures are scoped to that company.
 *
 * Note: every metric here derives from the bookings table — there is no
 * separate "non-booking" data source for delivered/spend/volume. On-time
 * delivery rate is replaced by completion rate: no ETA / promised-delivery
 * column exists in the schema, so on-time cannot be computed, whereas
 * completion rate (delivered ÷ committed) can.
 */
export class DashboardSummaryResponseDto {
  @ApiProperty({ example: 12, description: 'Bookings delivered/completed year-to-date' })
  deliveredCount!: number;

  @ApiProperty({
    example: 92,
    description: 'Share of committed bookings that have been delivered/completed (YTD), in percent',
  })
  completionRate!: number;

  @ApiProperty({ example: 1240000, description: 'Total paid spend year-to-date' })
  spendYtd!: number;

  @ApiProperty({ example: 'ETB' })
  spendCurrency!: string;

  @ApiProperty({ example: 16, description: 'Spend change vs same period last year, in percent' })
  spendYtdChangePct!: number;

  @ApiProperty({ type: FreightVolumeDto })
  freightVolume!: FreightVolumeDto;
}
