import {
  IsInt,
  IsString,
  IsOptional,
  IsArray,
  IsNotEmpty,
  ValidateNested,
  IsEnum,
} from 'class-validator';
import { Type } from 'class-transformer';
import { ApiProperty } from '@nestjs/swagger';

export enum TransmittalPurpose {
  FOR_APPROVAL = 'FOR_APPROVAL',
  FOR_INFORMATION = 'FOR_INFORMATION',
  FOR_REVIEW = 'FOR_REVIEW',
  OTHER = 'OTHER',
}

export class TransmittalItemDto {
  @ApiProperty({
    description: 'ประเภทรายการ (DRAWING, RFA, CORRESPONDENCE)',
    example: 'DRAWING',
  })
  @IsString()
  @IsNotEmpty()
  itemType!: string;

  @ApiProperty({ description: 'ID ของรายการ', example: 1 })
  @IsInt()
  @IsNotEmpty()
  itemId!: number;

  @ApiProperty({ description: 'รายละเอียดเพิ่มเติม', required: false })
  @IsString()
  @IsOptional()
  description?: string;
}

export class CreateTransmittalDto {
  @ApiProperty({ description: 'ID หรือ UUID ของโครงการ (ADR-019)' })
  @IsNotEmpty()
  projectId!: number | string;

  @ApiProperty({
    description: 'เรื่อง',
    example: 'Transmittal for Shop Drawings',
  })
  @IsString()
  @IsNotEmpty()
  subject!: string;

  @ApiProperty({ description: 'ผู้รับ Organization ID หรือ UUID (ADR-019)' })
  @IsNotEmpty()
  recipientOrganizationId!: number | string;

  @ApiProperty({
    description:
      'ผู้ส่ง Organization ID หรือ UUID (สำหรับผู้ใช้ที่มีสิทธิ system.manage_all)',
    required: false,
  })
  @IsOptional()
  originatorId?: number | string;

  @ApiProperty({
    description: 'Correspondence ID หรือ UUID (ADR-019)',
    required: false,
  })
  @IsOptional()
  correspondenceId?: number | string;

  @ApiProperty({
    description: 'วัตถุประสงค์',
    enum: TransmittalPurpose,
    example: TransmittalPurpose.FOR_APPROVAL,
  })
  @IsEnum(TransmittalPurpose)
  @IsOptional()
  purpose?: TransmittalPurpose;

  @ApiProperty({ description: 'หมายเหตุ', required: false })
  @IsString()
  @IsOptional()
  remarks?: string;

  @ApiProperty({ description: 'รายการที่แนบ', type: [TransmittalItemDto] })
  @IsArray()
  @ValidateNested({ each: true })
  @Type(() => TransmittalItemDto)
  items!: TransmittalItemDto[];
}
