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

export const FRECUENCIAS = ['mensual', 'bimestral', 'trimestral', 'semestral', 'anual', 'cada_n_meses'] as const;

export class ItemOportunidadDto {
  @ApiPropertyOptional({ description: 'Producto del catálogo. Sin él, el ítem es texto libre.' })
  @IsOptional()
  @IsUUID()
  producto_id?: string;

  @ApiPropertyOptional()
  @IsOptional()
  @IsUUID()
  presentacion_id?: string;

  @ApiPropertyOptional({ description: 'Por defecto, la descripción del producto.' })
  @IsOptional()
  @IsString()
  @MaxLength(255)
  descripcion?: string;

  @ApiProperty({ example: 10 })
  @IsNumber()
  @Min(0.0001)
  cantidad: number;

  @ApiPropertyOptional({
    description:
      'Sólo se respeta en ítems sin producto. Con producto, el precio sale de la lista del ' +
      'cliente: aceptarlo del body dejaría vender por debajo del mínimo sin control.',
  })
  @IsOptional()
  @IsNumber()
  @Min(0)
  precio_unitario?: number;

  @ApiPropertyOptional({ example: 10, description: 'Descuento en %, 0 a 100.' })
  @IsOptional()
  @IsNumber()
  @Min(0)
  @Max(100)
  descuento_pct?: number;

  @ApiPropertyOptional({ enum: [0, 5, 10], description: 'Por defecto, la del producto.' })
  @IsOptional()
  @IsIn([0, 5, 10])
  iva_tasa?: number;

  @ApiPropertyOptional({ enum: ['unico', 'recurrente'], default: 'unico' })
  @IsOptional()
  @IsIn(['unico', 'recurrente'])
  tipo_cobro?: string;

  @ApiPropertyOptional({ enum: FRECUENCIAS, description: 'Obligatoria si el ítem es recurrente.' })
  @IsOptional()
  @IsIn(FRECUENCIAS as unknown as string[])
  frecuencia?: string;

  @ApiPropertyOptional({ description: 'Con frecuencia "cada_n_meses", cada cuántos. Si no, la vigencia en meses.' })
  @IsOptional()
  @IsInt()
  @Min(1)
  n_meses?: number;
}
