import { ApiProperty, ApiPropertyOptional, PartialType } from '@nestjs/swagger';
import {
  ArrayUnique,
  IsArray,
  IsBoolean,
  IsDateString,
  IsNotEmpty,
  IsOptional,
  IsString,
  IsUUID,
  MaxLength,
} from 'class-validator';

// 일정 생성 DTO
export class CreateScheduleEventDto {
  @ApiProperty({ description: '일정 제목', example: '주간 팀 스탠드업' })
  @IsString()
  @IsNotEmpty({ message: '일정 제목을 입력해 주세요.' })
  @MaxLength(200, { message: '제목은 최대 200자입니다.' })
  title!: string;

  @ApiProperty({ description: '카테고리 id(uuid)' })
  @IsUUID('4', { message: '올바른 카테고리를 선택해 주세요.' })
  categoryId!: string;

  @ApiProperty({ description: '시작일(YYYY-MM-DD)', example: '2026-06-22' })
  @IsDateString({}, { message: '시작일 형식이 올바르지 않습니다.' })
  start!: string;

  @ApiProperty({ description: '종료일(YYYY-MM-DD)', example: '2026-06-22' })
  @IsDateString({}, { message: '종료일 형식이 올바르지 않습니다.' })
  end!: string;

  @ApiPropertyOptional({
    description: '표시용 시간 텍스트',
    example: '09:30 – 10:00',
  })
  @IsOptional()
  @IsString()
  @MaxLength(100)
  time?: string;

  @ApiPropertyOptional({ description: '장소', example: '3층 포커스룸 A' })
  @IsOptional()
  @IsString()
  @MaxLength(200)
  place?: string;

  @ApiPropertyOptional({ description: '설명/메모' })
  @IsOptional()
  @IsString()
  @MaxLength(2000)
  description?: string;

  @ApiPropertyOptional({ description: '전 직원 대상 여부', example: false })
  @IsOptional()
  @IsBoolean()
  allHands?: boolean;

  @ApiPropertyOptional({ description: '참석자 사용자 id 목록', type: [String] })
  @IsOptional()
  @IsArray()
  @IsUUID('4', { each: true })
  @ArrayUnique()
  attendeeIds?: string[];
}

// 일정 수정 DTO — 생성 DTO 의 부분 집합
export class UpdateScheduleEventDto extends PartialType(
  CreateScheduleEventDto,
) {}
