import {
  IsDateString,
  IsIn,
  IsInt,
  IsNotEmpty,
  IsOptional,
  IsString,
  Min,
  ValidateIf,
} from 'class-validator';

const SCHEDULE_TYPES = ['INTERVAL', 'CRON', 'ONE_SHOT'] as const;
const INTERVAL_UNITS = ['MINUTES', 'HOURS', 'DAYS'] as const;

export class RegisterScheduledJobDto {
  @IsString()
  @IsNotEmpty()
  jobId: string;

  @IsIn(SCHEDULE_TYPES)
  scheduleType: 'INTERVAL' | 'CRON' | 'ONE_SHOT';

  @ValidateIf((o: RegisterScheduledJobDto) => o.scheduleType === 'INTERVAL')
  @IsInt()
  @Min(1)
  intervalEvery?: number;

  @ValidateIf((o: RegisterScheduledJobDto) => o.scheduleType === 'INTERVAL')
  @IsIn(INTERVAL_UNITS)
  intervalUnit?: 'MINUTES' | 'HOURS' | 'DAYS';

  @ValidateIf((o: RegisterScheduledJobDto) => o.scheduleType === 'CRON')
  @IsString()
  @IsNotEmpty()
  cronExpression?: string;

  @IsOptional()
  @IsString()
  timezone?: string;

  @IsOptional()
  @IsDateString()
  startAt?: string | null;

  @IsOptional()
  @IsDateString()
  endAt?: string | null;
}
