import {
  ArrayMaxSize,
  ArrayNotEmpty,
  IsArray,
  IsIn,
  IsISO8601,
  IsNotEmpty,
  IsOptional,
  IsString,
  IsUUID,
  MaxLength,
  ValidateNested,
} from 'class-validator';
import { Type } from 'class-transformer';
import { ApiProperty } from '@nestjs/swagger';
import {
  CHECKLIST_CATEGORIES,
  type ChecklistCategory,
} from '../entities/checklist-item.entity';

// 체크리스트 입력 항목 (생성 시 함께 등록)
export class ChecklistInputDto {
  @ApiProperty({
    description: '체크리스트 항목 내용',
    example: '가로형 배너 디자인',
  })
  @IsString()
  @IsNotEmpty({ message: '체크리스트 항목 내용을 입력해 주세요.' })
  @MaxLength(200)
  text!: string;

  @ApiProperty({
    description: '카테고리(탭)',
    enum: CHECKLIST_CATEGORIES,
    required: false,
  })
  @IsOptional()
  @IsIn(CHECKLIST_CATEGORIES)
  category?: ChecklistCategory;
}

// 업무 생성 요청
export class CreateTaskDto {
  @ApiProperty({
    description: '업무 제목',
    example: '메인 배너 이미지 2종 디자인',
  })
  @IsString()
  @IsNotEmpty({ message: '업무 제목을 입력해 주세요.' })
  @MaxLength(200)
  title!: string;

  @ApiProperty({
    description: '본문 문단 배열(필수)',
    type: [String],
    example: ['9월 신제품 캠페인 메인 배너를 제작합니다.'],
  })
  @IsArray()
  @ArrayNotEmpty({ message: '업무 내용을 입력해 주세요.' })
  @ArrayMaxSize(200, { message: '본문 문단이 너무 많습니다.' })
  @IsString({ each: true })
  @MaxLength(5000, { each: true })
  content!: string[];

  @ApiProperty({
    description: '담당자 사용자 ID 배열(프로젝트 멤버만 가능)',
    type: [String],
    example: ['a1b2c3d4-...'],
  })
  @IsArray()
  @ArrayNotEmpty({ message: '담당자를 한 명 이상 지정해 주세요.' })
  @ArrayMaxSize(50, { message: '담당자가 너무 많습니다.' })
  @IsUUID('4', { each: true })
  assigneeIds!: string[];

  @ApiProperty({
    description: '마감 기한(ISO8601, 선택)',
    required: false,
    example: '2026-06-18T00:00:00Z',
  })
  @IsOptional()
  @IsISO8601({}, { message: '올바른 날짜 형식을 입력해 주세요.' })
  dueDate?: string;

  @ApiProperty({
    description: '체크리스트(선택)',
    type: [ChecklistInputDto],
    required: false,
  })
  @IsOptional()
  @IsArray()
  @ArrayMaxSize(100, { message: '체크리스트 항목이 너무 많습니다.' })
  @ValidateNested({ each: true })
  @Type(() => ChecklistInputDto)
  checklist?: ChecklistInputDto[];

  @ApiProperty({
    description:
      '중간 점검일 목록(ISO8601, 선택) — 작업자가 진행 상태를 보고하는 기준일',
    type: [String],
    required: false,
    example: ['2026-06-15T00:00:00Z'],
  })
  @IsOptional()
  @IsArray()
  @ArrayMaxSize(20, { message: '중간 점검일이 너무 많습니다.' })
  @IsISO8601(
    { strict: false },
    { each: true, message: '올바른 날짜 형식을 입력해 주세요.' },
  )
  checkpoints?: string[];
}
