import { ApiPropertyOptional } from '@nestjs/swagger';
import { DeviceStatus } from '../../generated/prisma/enums.js';
import { Type } from 'class-transformer';
import { EmptyStringToUndefined } from '../../common/transforms/empty-string-to-undefined.transform.js';
import { IsEnum, IsInt, IsOptional, IsString, Max, Min } from 'class-validator';

/**
 * 设备列表查询 DTO：支持管理员后台按设备、患者和医院筛选。
 */
export class DeviceQueryDto {
  @ApiPropertyOptional({
    description:
      '关键词（支持植入物型号 / 植入物名称 / 患者姓名 / 患者手机号）',
    example: '脑室',
  })
  @IsOptional()
  @IsString({ message: 'keyword 必须是字符串' })
  keyword?: string;

  @ApiPropertyOptional({
    description: '设备状态',
    enum: DeviceStatus,
    example: DeviceStatus.ACTIVE,
  })
  @IsOptional()
  @IsEnum(DeviceStatus, { message: 'status 枚举值不合法' })
  status?: DeviceStatus;

  @ApiPropertyOptional({ description: '医院 ID', example: 1 })
  @IsOptional()
  @EmptyStringToUndefined()
  @Type(() => Number)
  @IsInt({ message: 'hospitalId 必须是整数' })
  @Min(1, { message: 'hospitalId 必须大于 0' })
  hospitalId?: number;

  @ApiPropertyOptional({ description: '患者 ID', example: 1 })
  @IsOptional()
  @EmptyStringToUndefined()
  @Type(() => Number)
  @IsInt({ message: 'patientId 必须是整数' })
  @Min(1, { message: 'patientId 必须大于 0' })
  patientId?: number;

  @ApiPropertyOptional({
    description: '页码（默认 1）',
    example: 1,
    default: 1,
  })
  @IsOptional()
  @EmptyStringToUndefined()
  @Type(() => Number)
  @IsInt({ message: 'page 必须是整数' })
  @Min(1, { message: 'page 最小为 1' })
  page?: number = 1;

  @ApiPropertyOptional({
    description: '每页数量（默认 20，最大 100）',
    example: 20,
    default: 20,
  })
  @IsOptional()
  @EmptyStringToUndefined()
  @Type(() => Number)
  @IsInt({ message: 'pageSize 必须是整数' })
  @Min(1, { message: 'pageSize 最小为 1' })
  @Max(100, { message: 'pageSize 最大为 100' })
  pageSize?: number = 20;
}
