import { IsNotEmpty, IsString, IsEnum, IsArray, IsOptional, IsNumber } from 'class-validator';
import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger';
import { TicketPriority, TicketSource, TicketStatus } from 'common/enum/ticket.enum';
import { Transform } from 'class-transformer';

export class CreateTicketDto {
  @ApiProperty({ example: 'Fix login button' })
  @IsString()
  @IsNotEmpty()
  title: string;

  @ApiProperty({ example: 'The login button on the homepage is not working when clicked.' })
  @IsString()
  @IsNotEmpty()
  description: string;

  @ApiProperty({ enum: TicketPriority, default: TicketPriority.MEDIUM, required: false })
  @IsEnum(TicketPriority)
  @IsOptional()
  priority?: TicketPriority;

  @ApiProperty({ enum: TicketStatus, default: TicketStatus.OPEN, required: false })
  @IsEnum(TicketStatus)
  @IsOptional()
  status?: TicketStatus;

  // write for attachmentUrl
  @ApiProperty({ required: false, example: 'https://example.com/attachment', description: 'URL of the attached file (NOT FOR FRONTEND)' })
  @IsString()
  @IsOptional()
  attachmentUrl?: string;

  @ApiProperty({ required: false, example: 1 })
  @IsNumber()
  @IsOptional()
  assigneeId?: number;

  @ApiProperty({ type: [String], required: false, example: ['bug', 'frontend'] })
  @IsArray()
  @IsString({ each: true })
  @IsOptional()
  @Transform(({ value }) => (typeof value === 'string' ? value.split(',').map(label => label.trim()) : value))
  labels?: string[];

  @ApiProperty({
    type: 'string',
    format: 'binary',
    required: false,
    description: 'Attach a file (1 image, < 1MB)',
  })
  @IsOptional()
  attachment?: any;

  @ApiPropertyOptional({ enum: TicketSource, default: TicketSource.MANUAL, required: false })
  @IsEnum(TicketSource)
  @IsOptional()
  source?: TicketSource;

  @ApiPropertyOptional({ example: 1, description: 'Reference ID for the ticket' })
  @IsNumber()
  @IsOptional()
  referenceId?: number;

  @ApiPropertyOptional({ example: 'report', description: 'Reference type for the ticket' })
  @IsString()
  @IsOptional()
  referenceType?: string;
}
