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

import {
  OverviewBillingKpisDto,
  OverviewBookingKpisDto,
  OverviewCustomerKpisDto,
  OverviewOperationsKpisDto,
  OverviewPaymentTrendPointDto,
  OverviewPipelineCountDto,
  OverviewRecentBookingDto,
  OverviewStaffKpisDto,
  OverviewStatusCountDto,
  OverviewTrendPointDto,
} from './overview-response.dto';

export class OverviewLabelCountDto {
  @ApiProperty() label!: string;
  @ApiProperty() count!: number;
}

export class OverviewPaymentMethodDto {
  @ApiProperty() method!: string;
  @ApiProperty() count!: number;
  @ApiProperty() amountEtb!: number;
  @ApiProperty() amountUsd!: number;
}

export class OverviewCurrencyAmountDto {
  @ApiProperty() currency!: string;
  @ApiProperty() amount!: number;
}

export class OverviewBookingsTabDto {
  @ApiProperty({ type: OverviewBookingKpisDto })
  kpis!: OverviewBookingKpisDto;

  @ApiProperty({ type: [OverviewTrendPointDto] })
  bookingTrend!: OverviewTrendPointDto[];

  @ApiProperty({ type: [OverviewStatusCountDto] })
  bookingsByStatus!: OverviewStatusCountDto[];

  @ApiProperty({ type: [OverviewPipelineCountDto] })
  bookingsByPipeline!: OverviewPipelineCountDto[];

  @ApiProperty({ type: [OverviewLabelCountDto] })
  bookingsByFreightType!: OverviewLabelCountDto[];

  @ApiProperty({ type: [OverviewLabelCountDto] })
  bookingsByCurrency!: OverviewLabelCountDto[];

  @ApiProperty({ type: [OverviewRecentBookingDto] })
  recentBookings!: OverviewRecentBookingDto[];

  @ApiProperty()
  generatedAt!: string;
}

export class OverviewBillingTabDto {
  @ApiProperty({ type: OverviewBillingKpisDto })
  kpis!: OverviewBillingKpisDto;

  @ApiProperty({ type: [OverviewPaymentTrendPointDto] })
  paymentTrend!: OverviewPaymentTrendPointDto[];

  @ApiProperty({ type: [OverviewStatusCountDto] })
  paymentsByStatus!: OverviewStatusCountDto[];

  @ApiProperty({ type: [OverviewPaymentMethodDto] })
  paymentsByMethod!: OverviewPaymentMethodDto[];

  @ApiProperty({ type: [OverviewCurrencyAmountDto] })
  revenueByCurrency!: OverviewCurrencyAmountDto[];

  @ApiProperty()
  generatedAt!: string;
}

export class OverviewOperationsTabDto {
  @ApiProperty({ type: OverviewOperationsKpisDto })
  kpis!: OverviewOperationsKpisDto;

  @ApiProperty({ type: [OverviewStatusCountDto] })
  trainStatusBreakdown!: OverviewStatusCountDto[];

  @ApiProperty({ type: [OverviewStatusCountDto] })
  wagonStatusBreakdown!: OverviewStatusCountDto[];

  @ApiProperty({ type: [OverviewStatusCountDto] })
  containerStatusBreakdown!: OverviewStatusCountDto[];

  @ApiProperty({ type: [OverviewStatusCountDto] })
  cargoStatusBreakdown!: OverviewStatusCountDto[];

  @ApiProperty()
  generatedAt!: string;
}

export class OverviewCustomersTabDto {
  @ApiProperty({ type: OverviewCustomerKpisDto })
  kpis!: OverviewCustomerKpisDto;

  @ApiProperty({ type: [OverviewTrendPointDto] })
  customerGrowthTrend!: OverviewTrendPointDto[];

  @ApiProperty({ type: [OverviewLabelCountDto] })
  customersByType!: OverviewLabelCountDto[];

  @ApiProperty({ type: [OverviewLabelCountDto] })
  topCustomersByBookings!: OverviewLabelCountDto[];

  @ApiProperty()
  generatedAt!: string;
}

export class OverviewStaffTabDto {
  @ApiProperty({ type: OverviewStaffKpisDto })
  kpis!: OverviewStaffKpisDto;

  @ApiProperty({ type: [OverviewStatusCountDto] })
  usersByStatus!: OverviewStatusCountDto[];

  @ApiProperty({ type: [OverviewTrendPointDto] })
  employeeGrowthTrend!: OverviewTrendPointDto[];

  @ApiProperty({ type: [OverviewLabelCountDto] })
  activeUsersBreakdown!: OverviewLabelCountDto[];

  @ApiProperty()
  generatedAt!: string;
}
