import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger';
import {
  AssessmentType,
  CampaignAutoAssignMode,
  CampaignStatus,
  RecurrenceFrequency,
} from '@prisma/client';
import {
  ArrayUnique,
  IsArray,
  IsBoolean,
  IsDateString,
  IsEnum,
  IsInt,
  IsOptional,
  IsString,
  Max,
  Min,
} from 'class-validator';

export class CreateCampaignDto {
  @ApiProperty()
  @IsString()
  title!: string;

  @ApiProperty({ enum: AssessmentType })
  @IsEnum(AssessmentType)
  assessmentType!: AssessmentType;

  @ApiProperty()
  @IsString()
  templateId!: string;

  @ApiPropertyOptional()
  @IsOptional()
  @IsInt()
  @Min(1)
  @Max(12)
  periodMonth?: number;

  @ApiPropertyOptional()
  @IsOptional()
  @IsInt()
  @Min(2000)
  periodYear?: number;

  @ApiProperty()
  @IsDateString()
  startDate!: string;

  @ApiProperty()
  @IsDateString()
  endDate!: string;

  @ApiProperty({ enum: CampaignStatus })
  @IsEnum(CampaignStatus)
  status!: CampaignStatus;

  @ApiPropertyOptional({ default: false })
  @IsOptional()
  @IsBoolean()
  isAutoGenerated = false;

  @ApiPropertyOptional({ enum: RecurrenceFrequency, default: RecurrenceFrequency.NONE })
  @IsOptional()
  @IsEnum(RecurrenceFrequency)
  recurrenceFrequency: RecurrenceFrequency = RecurrenceFrequency.NONE;

  @ApiPropertyOptional({ default: 1 })
  @IsOptional()
  @IsInt()
  @Min(1)
  recurrenceInterval = 1;

  @ApiPropertyOptional({ enum: CampaignAutoAssignMode, default: CampaignAutoAssignMode.NONE })
  @IsOptional()
  @IsEnum(CampaignAutoAssignMode)
  autoAssignMode: CampaignAutoAssignMode = CampaignAutoAssignMode.NONE;

  @ApiPropertyOptional({ type: [String] })
  @IsOptional()
  @IsArray()
  @ArrayUnique()
  @IsString({ each: true })
  autoAssignEmployeeIds?: string[];
}
