import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger';
import { Type } from 'class-transformer';
import {
  ArrayMaxSize,
  ArrayNotEmpty,
  IsArray,
  IsObject,
  IsOptional,
  IsUUID,
  ValidateNested,
} from 'class-validator';

/** Tope de filas por request. Coincide con el del bulk homogéneo. */
export const BULK_FILAS_MAX = 1000;

export class BulkFilaDto {
  @ApiProperty({ example: 'cd88ac6a-2b0e-41bc-afd9-24b594cb8daf' })
  @IsUUID(undefined, { message: 'El id de producto debe ser un UUID válido' })
  id: string;

  @ApiProperty({
    example: { precio_costo: 610000 },
    description: 'Campos a modificar en ESTE producto. Distinto por fila.',
  })
  @IsObject({ message: 'campos debe ser un objeto' })
  campos: Record<string, unknown>;

  @ApiPropertyOptional({
    example: { precio_costo: 550000 },
    description:
      'Valores que el cliente tenía como "actuales" al montar la edición. Se usan para detectar que otro proceso (ej. una compra) modificó el producto mientras tanto.',
  })
  @IsOptional()
  @IsObject({ message: 'valores_previos debe ser un objeto' })
  valores_previos?: Record<string, unknown>;
}

export class BulkFilasDto {
  @ApiProperty({ type: [BulkFilaDto] })
  @IsArray({ message: 'filas debe ser un arreglo' })
  @ArrayNotEmpty({ message: 'Debe enviar al menos una fila' })
  @ArrayMaxSize(BULK_FILAS_MAX, {
    message: `No se pueden procesar más de ${BULK_FILAS_MAX} filas por solicitud`,
  })
  @ValidateNested({ each: true })
  @Type(() => BulkFilaDto)
  filas: BulkFilaDto[];
}
