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

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

export enum TicketCategory {
  IT = 'IT',
  HR = 'HR',
  ADMIN = 'ADMIN',
  FINANCE = 'FINANCE',
  OTHER = 'OTHER',
}

export enum TicketPriority {
  LOW = 'LOW',
  MEDIUM = 'MEDIUM',
  HIGH = 'HIGH',
  URGENT = 'URGENT',
}

export enum TicketStatus {
  OPEN = 'OPEN',
  IN_PROGRESS = 'IN_PROGRESS',
  RESOLVED = 'RESOLVED',
  CLOSED = 'CLOSED',
}

export enum AssigneeTeam {
  IT = 'IT',
  HR = 'HR',
  ADMIN = 'ADMIN',
  FINANCE = 'FINANCE',
}

// ==================== 创建工单 DTO ====================

export class CreateAITicketDto {
  @IsUUID()
  @IsNotEmpty()
  conversationId: string;

  @IsEnum(TicketCategory)
  @IsNotEmpty()
  category: TicketCategory;

  @IsEnum(TicketPriority)
  @IsOptional()
  priority?: TicketPriority = TicketPriority.MEDIUM;

  @IsString()
  @IsNotEmpty()
  @MinLength(10, { message: '问题描述至少 10 个字符' })
  @MaxLength(2000, { message: '问题描述最多 2000 个字符' })
  description: string;

  @IsBoolean()
  @IsNotEmpty({ message: '工单升级需要确认' })
  confirmed: boolean;
}

// ==================== 更新工单 DTO ====================

export class UpdateAITicketDto {
  @IsEnum(TicketPriority)
  @IsOptional()
  priority?: TicketPriority;

  @IsUUID()
  @IsOptional()
  assigneeId?: string;

  @IsEnum(AssigneeTeam)
  @IsOptional()
  assigneeTeam?: AssigneeTeam;
}

// ==================== 分配工单 DTO ====================

export class AssignAITicketDto {
  @IsUUID()
  @IsOptional()
  assigneeId?: string;

  @IsEnum(AssigneeTeam)
  @IsOptional()
  assigneeTeam?: AssigneeTeam;
}

// ==================== 解决工单 DTO ====================

export class ResolveAITicketDto {
  @IsString()
  @IsNotEmpty()
  @MinLength(10, { message: '解决方案至少 10 个字符' })
  @MaxLength(2000, { message: '解决方案最多 2000 个字符' })
  resolution: string;
}

// ==================== 查询工单 DTO ====================

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

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

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

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

  @IsEnum(TicketPriority)
  @IsOptional()
  priority?: TicketPriority;

  @IsEnum(AssigneeTeam)
  @IsOptional()
  assigneeTeam?: AssigneeTeam;

  @IsString()
  @IsOptional()
  view?: 'my_created' | 'my_assigned' | 'all';

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

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