import { Type } from 'class-transformer';
import {
  ArrayMaxSize,
  IsArray,
  IsIn,
  IsInt,
  IsNotEmpty,
  IsObject,
  IsOptional,
  IsString,
  IsUUID,
  Max,
  MaxLength,
  Min,
} from 'class-validator';
import { REASONING_EFFORT_LEVELS } from '../../ai-config/dto/ai-config.dto';

export class CreateConversationDto {
  @IsOptional()
  @IsString()
  @MaxLength(100)
  title?: string;

  @IsOptional()
  @IsString()
  @MaxLength(50)
  lockedSkillKey?: string | null;
}

export class UpdateConversationDto {
  @IsOptional()
  @IsString()
  @IsNotEmpty()
  @MaxLength(100)
  title?: string;

  @IsOptional()
  @IsString()
  @MaxLength(50)
  lockedSkillKey?: string | null;
}

export class SendMessageDto {
  @IsString()
  @IsNotEmpty()
  @MaxLength(16000)
  message: string;

  @IsOptional()
  @IsArray()
  @ArrayMaxSize(5)
  @IsInt({ each: true })
  @Min(1, { each: true })
  attachmentIds?: number[];

  @IsOptional()
  @IsString()
  @MaxLength(50)
  skillKey?: string | null;

  @IsUUID()
  clientRequestId: string;

  @IsOptional()
  @IsIn(REASONING_EFFORT_LEVELS)
  reasoningEffort?: string | null;
}

export class RegenerateMessageDto {
  @IsUUID()
  clientRequestId: string;

  @IsOptional()
  @IsIn(REASONING_EFFORT_LEVELS)
  reasoningEffort?: string | null;
}

export class EditMessageDto {
  @IsString()
  @IsNotEmpty()
  @MaxLength(16000)
  content: string;

  @IsUUID()
  clientRequestId: string;

  @IsOptional()
  @IsIn(REASONING_EFFORT_LEVELS)
  reasoningEffort?: string | null;
}

export class SubmitFormDto {
  @IsUUID()
  clientRequestId: string;

  @IsObject()
  values: Record<string, unknown>;

  @IsOptional()
  @IsIn(REASONING_EFFORT_LEVELS)
  reasoningEffort?: string | null;
}

export class SubmitReviewDto {
  @IsUUID()
  clientRequestId: string;

  @IsOptional()
  @IsIn(REASONING_EFFORT_LEVELS)
  reasoningEffort?: string | null;
}

export class MessagePageQueryDto {
  @IsOptional()
  @Type(() => Number)
  @IsInt()
  @Min(1)
  page?: number;

  @IsOptional()
  @Type(() => Number)
  @IsInt()
  @Min(1)
  @Max(100)
  limit?: number;
}
