import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger';
import { Type } from 'class-transformer';
import {
  ArrayMinSize,
  IsArray,
  IsBoolean,
  IsDateString,
  IsInt,
  IsNumber,
  IsOptional,
  IsUUID,
  Min,
} from 'class-validator';

export class CreateContainerTrainScheduleDto {
  @ApiProperty({ format: 'uuid' })
  @IsUUID()
  routeId!: string;

  @ApiProperty({ example: '2026-06-20T08:00:00.000Z' })
  @IsDateString()
  scheduleDate!: string;

  @ApiPropertyOptional({
    format: 'uuid',
    description:
      'Built train (Train Builder) to run this departure — its locomotive set is used. Provide either trainId or locomotiveIds.',
  })
  @IsOptional()
  @IsUUID()
  trainId?: string;

  @ApiPropertyOptional({
    type: [String],
    format: 'uuid',
    description:
      'Hand-picked locomotives pulling the train (minimum 2 — front and back). Ignored when trainId is provided.',
  })
  @IsOptional()
  @IsArray()
  @ArrayMinSize(2, { message: 'A train must be pulled by at least two locomotives' })
  @IsUUID('all', { each: true })
  locomotiveIds?: string[];

  @ApiPropertyOptional({ description: 'Maximum total booking weight allowed on this train' })
  @IsOptional()
  @Type(() => Number)
  @IsNumber()
  @Min(1)
  maxTrainWeightTons?: number;

  @ApiPropertyOptional({ description: 'Maximum total wagon length allowed on this train' })
  @IsOptional()
  @Type(() => Number)
  @IsNumber()
  @Min(1)
  maxTrainLengthMeters?: number;

  @ApiPropertyOptional({ description: 'Maximum wagons allowed on this train' })
  @IsOptional()
  @Type(() => Number)
  @IsInt()
  @Min(1)
  maxWagonsPerTrain?: number;

  @ApiPropertyOptional({
    description:
      'Reverse the wagon order on this train: the physically-last wagon becomes ' +
      'position 1. Frozen on the schedule; applied every time the wagon plan is ' +
      'rebuilt so the stored train order and the schedule order stay in sync.',
    default: false,
  })
  @IsOptional()
  @IsBoolean()
  reverseWagonOrder?: boolean;
}
