import {
  IsString,
  IsOptional,
  IsEnum,
  IsBoolean,
  IsInt,
  IsArray,
  Min,
  Max,
  IsDateString,
  ValidateNested,
} from 'class-validator';
import { Type } from 'class-transformer';
import { TagType, TagValueType } from '../../../domain/entities/user-tag.entity';

// =====================
// 标签分类 DTO
// =====================

/**
 * 创建标签分类
 */
export class CreateTagCategoryDto {
  @IsString()
  code: string;

  @IsString()
  name: string;

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

  @IsOptional()
  @IsInt()
  sortOrder?: number;
}

/**
 * 更新标签分类
 */
export class UpdateTagCategoryDto {
  @IsOptional()
  @IsString()
  name?: string;

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

  @IsOptional()
  @IsInt()
  sortOrder?: number;

  @IsOptional()
  @IsBoolean()
  isEnabled?: boolean;
}

// =====================
// 标签定义 DTO
// =====================

/**
 * 创建标签
 */
export class CreateTagDto {
  @IsString()
  code: string;

  @IsString()
  name: string;

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

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

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

  @IsOptional()
  @IsEnum(TagType)
  type?: TagType;

  @IsOptional()
  @IsEnum(TagValueType)
  valueType?: TagValueType;

  @IsOptional()
  @IsArray()
  @IsString({ each: true })
  enumValues?: string[];

  @IsOptional()
  @IsBoolean()
  isAdvertisable?: boolean;

  @IsOptional()
  @IsInt()
  sortOrder?: number;
}

/**
 * 更新标签
 */
export class UpdateTagDto {
  @IsOptional()
  @IsString()
  categoryId?: string | null;

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

  @IsOptional()
  @IsString()
  description?: string | null;

  @IsOptional()
  @IsString()
  color?: string | null;

  @IsOptional()
  @IsEnum(TagValueType)
  valueType?: TagValueType;

  @IsOptional()
  @IsArray()
  @IsString({ each: true })
  enumValues?: string[] | null;

  @IsOptional()
  @IsBoolean()
  isAdvertisable?: boolean;

  @IsOptional()
  @IsBoolean()
  isEnabled?: boolean;

  @IsOptional()
  @IsInt()
  sortOrder?: number;
}

/**
 * 查询标签列表
 */
export class ListTagsDto {
  @IsOptional()
  @IsString()
  categoryId?: string;

  @IsOptional()
  @IsEnum(TagType)
  type?: TagType;

  @IsOptional()
  @IsBoolean()
  isEnabled?: boolean;

  @IsOptional()
  @IsBoolean()
  isAdvertisable?: boolean;

  @IsOptional()
  @IsInt()
  @Min(1)
  @Max(100)
  limit?: number;

  @IsOptional()
  @IsInt()
  @Min(0)
  offset?: number;
}

// =====================
// 标签关联规则 DTO
// =====================

/**
 * 关联规则到标签
 */
export class LinkRuleToTagDto {
  @IsString()
  ruleId: string;
}

// =====================
// 用户标签操作 DTO
// =====================

/**
 * 给用户打标签
 */
export class AssignTagToUserDto {
  @IsString()
  accountSequence: string;

  @IsString()
  tagId: string;

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

  @IsOptional()
  @IsDateString()
  expiresAt?: string;

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

/**
 * 批量打标签
 */
export class BatchAssignTagDto {
  @IsArray()
  @IsString({ each: true })
  accountSequences: string[];

  @IsString()
  tagId: string;

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

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

/**
 * 移除用户标签
 */
export class RemoveTagFromUserDto {
  @IsString()
  accountSequence: string;

  @IsString()
  tagId: string;

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

/**
 * 查询用户标签
 */
export class GetUserTagsDto {
  @IsString()
  accountSequence: string;
}

/**
 * 查询标签下的用户
 */
export class GetTagUsersDto {
  @IsString()
  tagId: string;

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

  @IsOptional()
  @IsInt()
  @Min(1)
  @Max(100)
  limit?: number;

  @IsOptional()
  @IsInt()
  @Min(0)
  offset?: number;
}

/**
 * 同步用户自动标签
 */
export class SyncUserAutoTagsDto {
  @IsString()
  accountSequence: string;
}

/**
 * 批量同步自动标签
 */
export class BatchSyncAutoTagsDto {
  @IsArray()
  @IsString({ each: true })
  accountSequences: string[];
}

// =====================
// 标签日志查询 DTO
// =====================

/**
 * 查询标签变更日志
 */
export class ListTagLogsDto {
  @IsOptional()
  @IsString()
  accountSequence?: string;

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

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

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

  @IsOptional()
  @IsInt()
  @Min(1)
  @Max(100)
  limit?: number;

  @IsOptional()
  @IsInt()
  @Min(0)
  offset?: number;
}
