import {
  IsString,
  IsOptional,
  IsBoolean,
  IsInt,
  IsUUID,
  IsEnum,
  IsArray,
  IsObject,
  MinLength,
  MaxLength,
  Min,
  ValidateNested,
} from 'class-validator';
import { Type } from 'class-transformer';

// ============================================
// Enums
// ============================================

export enum GroupFieldType {
  TEXT = 'TEXT',
  NUMBER = 'NUMBER',
  DECIMAL = 'DECIMAL',
  BOOLEAN = 'BOOLEAN',
  DATE = 'DATE',
  DATETIME = 'DATETIME',
  SELECT = 'SELECT',
  MULTISELECT = 'MULTISELECT',
  TEXTAREA = 'TEXTAREA',
  URL = 'URL',
  EMAIL = 'EMAIL',
  PHONE = 'PHONE',
}

// ============================================
// Create DTOs
// ============================================

export class CreateGroupCustomFieldDto {
  
  @IsString()
  @MinLength(1)
  @MaxLength(50)
  key: string;

  
  @IsString()
  @MinLength(1)
  @MaxLength(100)
  nameEn: string;  // 英文名称（必填）

  
  @IsOptional()
  @IsString()
  @MaxLength(100)
  nameCn?: string;  // 中文名称（可选）

  
  @IsEnum(GroupFieldType)
  type: GroupFieldType;

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

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

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

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

  
  @IsOptional()
  @IsArray()
  options?: string[];

  
  @IsOptional()
  @IsObject()
  validation?: Record<string, any>;

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

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

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

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

export class CreatePartGroupDto {
  
  @IsString()
  @MinLength(1)
  @MaxLength(100)
  name: string;

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

  
  @IsOptional()
  @IsInt()
  @Min(0)
  displayOrder?: number;

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

  
  @IsOptional()
  @IsArray()
  @ValidateNested({ each: true })
  @Type(() => CreateGroupCustomFieldDto)
  customFields?: CreateGroupCustomFieldDto[];
}

// ============================================
// Update DTOs
// ============================================

export class UpdateGroupCustomFieldDto {
  
  @IsOptional()
  @IsUUID()
  id?: string;

  
  @IsOptional()
  @IsString()
  @MinLength(1)
  @MaxLength(50)
  key?: string;

  
  @IsOptional()
  @IsString()
  @MinLength(1)
  @MaxLength(100)
  nameEn?: string;  // 英文名称

  
  @IsOptional()
  @IsString()
  @MaxLength(100)
  nameCn?: string;  // 中文名称

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

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

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

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

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

  
  @IsOptional()
  @IsArray()
  options?: string[];

  
  @IsOptional()
  @IsObject()
  validation?: Record<string, any>;

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

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

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

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

export class UpdatePartGroupDto {
  
  @IsOptional()
  @IsString()
  @MinLength(1)
  @MaxLength(100)
  name?: string;

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

  
  @IsOptional()
  @IsInt()
  @Min(0)
  displayOrder?: number;

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

// ============================================
// Assign Parts to Group DTO
// ============================================

export class AssignPartsToGroupDto {
  
  @IsArray()
  @IsUUID('4', { each: true })
  partIds: string[];
}

// ============================================
// Response DTOs
// ============================================

export class GroupCustomFieldResponseDto {
  id: string;
  groupId: string;
  key: string;
  nameEn: string;  // 英文名称（必填）
  nameCn?: string;  // 中文名称（可选）
  type: GroupFieldType;
  required: boolean;
  visible: boolean;
  editable: boolean;
  searchable: boolean;
  options?: string[];
  validation?: Record<string, any>;
  description?: string;
  placeholder?: string;
  helpText?: string;
  displayOrder: number;
  createdAt: Date;
  updatedAt: Date;
}

export class PartGroupResponseDto {
  id: string;
  name: string;
  description?: string;
  displayOrder: number;
  isActive: boolean;
  partsCount: number;
  fieldsCount: number;
  customFields?: GroupCustomFieldResponseDto[];
  createdAt: Date;
  updatedAt: Date;
}

// ============================================
// Query DTOs
// ============================================

export class QueryPartGroupsDto {
  
  @IsOptional()
  @IsString()
  search?: string;

  
  @IsOptional()
  @IsBoolean()
  @Type(() => Boolean)
  isActive?: boolean;

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

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

