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';

// 수정 시 체크리스트 항목 — id 있으면 기존 항목 갱신(완료 상태 보존), 없으면 신규 추가
export class UpdateChecklistItemInput {
  @ApiProperty({
    description: '기존 항목 ID(신규 추가 시 생략)',
    required: false,
  })
  @IsOptional()
  @IsUUID('4')
  id?: string;

  @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 UpdateTaskDto {
  @ApiProperty({ description: '업무 제목', required: false })
  @IsOptional()
  @IsString()
  @IsNotEmpty({ message: '업무 제목을 입력해 주세요.' })
  @MaxLength(200)
  title?: string;

  @ApiProperty({
    description: '본문 문단 배열',
    type: [String],
    required: false,
  })
  @IsOptional()
  @IsArray()
  @ArrayMaxSize(200, { message: '본문 문단이 너무 많습니다.' })
  @IsString({ each: true })
  @MaxLength(5000, { each: true })
  content?: string[];

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

  @ApiProperty({
    description: '마감 기한(ISO8601). null 이면 마감 해제',
    required: false,
    nullable: true,
  })
  @IsOptional()
  @IsISO8601({}, { message: '올바른 날짜 형식을 입력해 주세요.' })
  dueDate?: string | null;

  @ApiProperty({
    description:
      '체크리스트 전체(추가/삭제/순서 동기화). id 있는 항목은 유지(완료 보존), 없으면 신규, 빠진 기존 항목은 삭제',
    type: [UpdateChecklistItemInput],
    required: false,
  })
  @IsOptional()
  @IsArray()
  @ArrayMaxSize(100, { message: '체크리스트 항목이 너무 많습니다.' })
  @ValidateNested({ each: true })
  @Type(() => UpdateChecklistItemInput)
  checklist?: UpdateChecklistItemInput[];

  @ApiProperty({
    description:
      '중간 점검일 목록(ISO8601). 제공 시 전체 교체, 빈 배열이면 모두 삭제',
    type: [String],
    required: false,
  })
  @IsOptional()
  @IsArray()
  @ArrayMaxSize(20, { message: '중간 점검일이 너무 많습니다.' })
  @IsISO8601(
    { strict: false },
    { each: true, message: '올바른 날짜 형식을 입력해 주세요.' },
  )
  checkpoints?: string[];
}
