import {
  IsString,
  IsOptional,
  IsNumber,
  IsEnum,
  IsInt,
  Min,
  IsUrl,
  IsDecimal,
  IsUUID,
  IsArray,
  ValidateNested,
  IsBoolean,
} from 'class-validator';
import { Type, Transform } from 'class-transformer';
import { PartStatus } from '@prisma/client';

/**
 * 库存状态枚举（计算字段）
 */
export enum StockStatus {
  NORMAL = 'NORMAL',           // 库存正常
  LOW = 'LOW',                 // 库存偏低
  OUT_OF_STOCK = 'OUT_OF_STOCK' // 缺货
}

/**
 * 创建零件 DTO
 */
export class CreatePartDto {
  // 核心字段（与 Schema 对应）
  @IsString()
  partNumber: string;

  @IsString()
  partNameEn: string;  // 英文名称（必填）

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

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

  @IsOptional()
  @IsString()
  source?: string;  // 来源（与 Schema 一致）

  @IsOptional()
  @IsString()
  specifications?: string;  // 规格

  @IsOptional()
  @IsString()
  remark?: string;  // 备注（与 Schema 一致）

  // 库存信息
  @IsOptional()
  @IsInt()
  @Min(0)
  currentStock?: number;

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

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

  // 工位与仓位
  @IsOptional()
  @IsString()
  station?: string;

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

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

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

  @IsOptional()
  @IsUrl()
  imageUrl?: string;

  // 状态
  @IsOptional()
  @IsEnum(PartStatus)
  status?: PartStatus;

  // 元数据
  @IsOptional()
  metadata?: any;
  
  // 分组关联
  @IsOptional()
  @IsArray()
  @IsUUID('4', { each: true })
  groupIds?: string[];
  
  // 自定义字段值
  @IsOptional()
  customFields?: Record<string, any>;
}

/**
 * 更新零件 DTO
 */
export class UpdatePartDto {
  @IsOptional()
  @IsString()
  partNumber?: string;

  @IsOptional()
  @IsString()
  partNameEn?: string;  // 英文名称

  @IsOptional()
  @IsString()
  partNameCn?: string;  // 中文名称

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

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

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

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

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

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

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

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

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

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

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

  @IsOptional()
  @IsUrl()
  imageUrl?: string;

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

  @IsOptional()
  @IsArray()
  @IsUUID('4', { each: true })
  groupIds?: string[];

  @IsOptional()
  customFields?: Record<string, any>;
}

/**
 * 查询零件 DTO
 */
export class QueryPartsDto {
  @IsOptional()
  @IsString()
  search?: string;

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

  @IsOptional()
  @IsString()
  partNameEn?: string;  // 英文名称搜索

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

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

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

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

  @IsOptional()
  @IsEnum(StockStatus)
  stockStatus?: StockStatus;  // 库存状态筛选

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

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

  @IsOptional()
  @IsString()
  sortBy?: string = 'createdAt';

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

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

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

  @IsOptional()
  @IsArray()
  @IsUUID('4', { each: true })
  @Transform(({ value }) => {
    // 将单个字符串转换为数组
    if (typeof value === 'string') {
      return [value];
    }
    return value;
  })
  groupIds?: string[];
}

/**
 * 批量导入零件 DTO
 */
export class BulkImportPartsDto {
  @IsArray()
  @ValidateNested({ each: true })
  @Type(() => CreatePartDto)
  parts: CreatePartDto[];

  @IsOptional()
  @IsBoolean()
  updateExisting?: boolean = false;

  @IsOptional()
  @IsBoolean()
  skipErrors?: boolean = true;
}

/**
 * 生成标签 DTO
 */
export class GenerateLabelDto {
  @IsUUID()
  partId: string;

  @IsOptional()
  @IsString()
  template?: string = 'standard';

  @IsOptional()
  @IsString()
  size?: string = '50x30';

  @IsOptional()
  @IsInt()
  @Min(1)
  quantity?: number = 1;
}

/**
 * 批量生成标签 DTO
 */
export class BulkGenerateLabelsDto {
  @IsArray()
  @IsUUID('4', { each: true })
  partIds: string[];

  @IsOptional()
  @IsString()
  template?: string = 'standard';

  @IsOptional()
  @IsString()
  size?: string = '50x30';

  @IsOptional()
  @IsInt()
  @Min(1)
  quantityPerPart?: number = 1;
}

/**
 * 打印标签 DTO
 */
export class PrintLabelDto {
  @IsUUID()
  labelId: string;

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

/**
 * 批量打印标签 DTO
 */
export class BulkPrintLabelsDto {
  @IsArray()
  @IsUUID('4', { each: true })
  labelIds: string[];

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

