import { IsInt, IsString, Min, Max, IsNotEmpty, IsOptional, MaxLength } from 'class-validator';
import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger';

/**
 * 购买预种份额请求 DTO
 *
 * === 省市字段说明 ===
 * provinceCode / cityCode：必填，用于后端业务校验（续购时验证省市一致性）
 * provinceName / cityName：可选，仅用于存储展示，不参与业务逻辑判断
 *
 * 为何 provinceName / cityName 设为可选（@IsOptional）：
 * 1. 后端服务启用了 ValidationPipe({ forbidNonWhitelisted: true })，
 *    未声明的字段会直接返回 400 报错，因此所有前端发送的字段都必须在 DTO 中声明。
 * 2. 省市名称是辅助展示字段，不影响业务流程；部分旧版客户端可能不发送名称，兼容处理。
 * 3. 存储逻辑：名称只在首次购买时写入 pre_planting_positions.province_name / city_name，
 *    续购时后端以 position.provinceCode 判断一致性，名称字段在首购后已锁定不再更新。
 *
 * 参考：认种正式购买 SelectProvinceCityDto 的同名字段处理方式。
 */
export class PurchasePrePlantingDto {
  @ApiProperty({ description: '购买份数', example: 1, minimum: 1, maximum: 10 })
  @IsInt()
  @Min(1)
  @Max(10)
  portionCount: number;

  @ApiProperty({ description: '省代码（行政区划代码前两位）', example: '44' })
  @IsString()
  @IsNotEmpty()
  provinceCode: string;

  /**
   * 省名称（可选）
   * - 首次购买时前端传入，存储到 pre_planting_positions.province_name
   * - 续购时依然传入（复用持仓中已有的名称），后端忽略更新（首购后锁定）
   */
  @ApiPropertyOptional({ description: '省名称（可选，首购时存储）', example: '广东省' })
  @IsOptional()
  @IsString()
  @MaxLength(50)
  provinceName?: string;

  @ApiProperty({ description: '市代码（行政区划代码前四位）', example: '4401' })
  @IsString()
  @IsNotEmpty()
  cityCode: string;

  /**
   * 市名称（可选）
   * - 首次购买时前端传入，存储到 pre_planting_positions.city_name
   * - 续购时依然传入（复用持仓中已有的名称），后端忽略更新（首购后锁定）
   */
  @ApiPropertyOptional({ description: '市名称（可选，首购时存储）', example: '广州市' })
  @IsOptional()
  @IsString()
  @MaxLength(50)
  cityName?: string;
}
