import { ApiPropertyOptional } from '@nestjs/swagger';
import { Type } from 'class-transformer';
import { IsInt, IsNumber, IsOptional, Max, Min } from 'class-validator';

/**
 * Per-schedule booking-window rule override (staff action on the ops board).
 * Every field is optional — only the ones sent are changed; the rest keep the
 * schedule's existing snapshot. Mirrors the window fields of the global rules DTO.
 */
export class UpdateScheduleWindowRuleDto {
  @ApiPropertyOptional({ example: 8, description: 'Local EAT hour the booking desk opens each day' })
  @IsOptional()
  @Type(() => Number)
  @IsInt()
  @Min(0)
  @Max(23)
  windowOpenHour?: number;

  @ApiPropertyOptional({
    example: 17,
    description:
      'Local EAT hour the booking desk shuts each day; a not-yet-full window resumes next morning at windowOpenHour. Equal to windowOpenHour = 24-hour desk',
  })
  @IsOptional()
  @Type(() => Number)
  @IsInt()
  @Min(0)
  @Max(23)
  windowCloseHour?: number;

  @ApiPropertyOptional({ example: 3, description: 'How long each booking cycle stays open, in hours' })
  @IsOptional()
  @Type(() => Number)
  @IsNumber()
  @Min(0.0166)
  @Max(12)
  windowDurationHours?: number;

  @ApiPropertyOptional({ example: 30, description: 'Max staff document-review minutes after the window closes' })
  @IsOptional()
  @Type(() => Number)
  @IsInt()
  @Min(0)
  docReviewMinutes?: number;

  @ApiPropertyOptional({ example: 60, description: 'Customer payment window minutes' })
  @IsOptional()
  @Type(() => Number)
  @IsInt()
  @Min(1)
  paymentWindowMinutes?: number;

  @ApiPropertyOptional({
    example: 3,
    description: 'Days before departure the booking window starts (re-derives the window start)',
  })
  @IsOptional()
  @Type(() => Number)
  @IsInt()
  @Min(0)
  importWindowLeadDays?: number;

  @ApiPropertyOptional({
    example: 24,
    description:
      'Hours before departure the single FCFS export window opens (EXPORT schedules; re-derives the window start)',
  })
  @IsOptional()
  @Type(() => Number)
  @IsInt()
  @Min(1)
  exportBookingLeadHours?: number;
}
