import {
  IsString,
  IsNotEmpty,
  IsOptional,
  IsEnum,
  IsUUID,
  IsArray,
  IsInt,
  Min,
  Max,
  MaxLength,
  MinLength,
} from 'class-validator';
import { Type, Transform } from 'class-transformer';

// ==================== 枚举定义 ====================

export enum ConversationStatus {
  ACTIVE = 'ACTIVE',
  CLOSED = 'CLOSED',
  ESCALATED = 'ESCALATED',
}

export enum ConversationCategory {
  IT = 'IT',
  HR = 'HR',
  ADMIN = 'ADMIN',
  GENERAL = 'GENERAL',
}

export enum MessageRole {
  USER = 'USER',
  ASSISTANT = 'ASSISTANT',
  SYSTEM = 'SYSTEM',
}

export enum MessageSource {
  USER = 'USER',
  AI = 'AI',
  SYSTEM = 'SYSTEM',
  ESCALATION = 'ESCALATION',
}

// ==================== 创建对话 DTO ====================

export class CreateConversationDto {
  @IsString()
  @IsOptional()
  @MinLength(2, { message: '标题至少 2 个字符' })
  @MaxLength(200, { message: '标题最多 200 个字符' })
  title?: string;

  @IsEnum(ConversationCategory)
  @IsOptional()
  category?: ConversationCategory;
}

// ==================== 发送消息 DTO ====================

export class SendMessageDto {
  @IsString()
  @IsNotEmpty({ message: '消息内容不能为空' })
  @MinLength(1, { message: '消息内容不能为空' })
  @MaxLength(4000, { message: '消息内容最多 4000 个字符' })
  content: string;
}

// ==================== 查询对话 DTO ====================

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

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

  @IsEnum(ConversationStatus)
  @IsOptional()
  status?: ConversationStatus;

  @IsEnum(ConversationCategory)
  @IsOptional()
  category?: ConversationCategory;

  @IsString()
  @IsOptional()
  keyword?: string;

  @IsString()
  @IsOptional()
  startDate?: string;

  @IsString()
  @IsOptional()
  endDate?: string;

  @IsString()
  @IsOptional()
  sortBy?: 'createdAt' | 'updatedAt';

  @IsString()
  @IsOptional()
  sortOrder?: 'asc' | 'desc';
}

// ==================== 用户上下文 DTO ====================

export class UserContextDto {
  @IsUUID()
  @IsOptional()
  departmentId?: string;

  @IsString()
  @IsOptional()
  departmentName?: string;

  @IsString()
  @IsOptional()
  region?: string;

  @IsString()
  @IsOptional()
  jobLevel?: string;
}
