import {
  IsString,
  IsOptional,
  IsNumber,
  IsEnum,
  IsInt,
  Min,
  IsUUID,
  IsArray,
  IsObject,
  IsBoolean,
} from 'class-validator';
import { Type } from 'class-transformer';
import { InventoryOperationType } from '@prisma/client';

/**
 * 扫码入库 DTO (Check-in)
 */
export class CheckInDto {
  @IsString()
  code: string; // 扫描的二维码或条码

  @IsInt()
  @Min(1)
  quantity: number;

  @IsEnum(InventoryOperationType)
  operationType: InventoryOperationType = InventoryOperationType.CHECK_IN;

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

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

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

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

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

  @IsOptional()
  @IsObject()
  deviceInfo?: any;

  @IsOptional()
  @IsObject()
  metadata?: any;
}

/**
 * 扫码出库 DTO (Check-out)
 */
export class CheckOutDto {
  @IsString()
  code: string; // 扫描的二维码或条码

  @IsInt()
  @Min(1)
  quantity: number;

  @IsString()
  station: string; // 领料工位（必填）

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

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

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

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

  @IsOptional()
  @IsObject()
  deviceInfo?: any;

  @IsOptional()
  @IsObject()
  metadata?: any;
}

/**
 * 库存调整 DTO
 */
export class AdjustInventoryDto {
  @IsUUID()
  partId: string;

  @IsInt()
  newStock: number;

  @IsString()
  reason: string;

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

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

  @IsOptional()
  @IsObject()
  metadata?: any;
}

/**
 * 库存转移 DTO
 */
export class TransferInventoryDto {
  @IsUUID()
  partId: string;

  @IsInt()
  @Min(1)
  quantity: number;

  @IsString()
  fromStation: string;

  @IsString()
  toStation: string;

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

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

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

  @IsOptional()
  @IsObject()
  metadata?: any;
}

/**
 * 查询库存日志 DTO
 */
export class QueryInventoryLogsDto {
  @IsOptional()
  @IsUUID()
  partId?: string;

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

  @IsOptional()
  @IsEnum(InventoryOperationType)
  operationType?: InventoryOperationType;

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

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

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

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

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

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

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

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

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

/**
 * 库存统计查询 DTO
 */
export class InventoryStatsDto {
  @IsOptional()
  @IsString()
  station?: string;

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

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

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

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

  @IsOptional()
  @IsEnum(InventoryOperationType)
  operationType?: InventoryOperationType;
}

/**
 * 库存告警查询 DTO
 */
export class QueryStockAlertsDto {
  @IsOptional()
  @IsUUID()
  partId?: string;

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

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

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

  @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';
}

/**
 * 确认告警 DTO
 */
export class AcknowledgeAlertDto {
  @IsUUID()
  alertId: string;

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

/**
 * 解决告警 DTO
 */
export class ResolveAlertDto {
  @IsUUID()
  alertId: string;

  @IsString()
  resolution: string;

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

/**
 * 批量操作 DTO
 */
export class BulkInventoryOperationDto {
  @IsArray()
  operations: Array<{
    partId: string;
    quantity: number;
    operationType: InventoryOperationType;
    station?: string;
    warehouseLocation?: string;
    reason?: string;
  }>;

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

