import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger';
import { Type } from 'class-transformer';
import {
  ArrayMaxSize,
  ArrayMinSize,
  IsArray,
  IsIn,
  IsNumber,
  IsOptional,
  IsString,
  IsUUID,
  MaxLength,
  Min,
  ValidateNested,
} from 'class-validator';

export class CuotaACobrarDto {
  @ApiProperty() @IsUUID() cuota_id: string;
  @ApiPropertyOptional({
    description: 'Capital a cobrar; por defecto, todo el saldo de la cuota (pago parcial si es menos)',
  })
  @IsOptional()
  @IsNumber({ maxDecimalPlaces: 2 })
  @Min(0.01)
  monto?: number;
}

export class CobrarCuotasDto {
  @ApiProperty({ type: [CuotaACobrarDto] })
  @IsArray()
  @ArrayMinSize(1, { message: 'Elegí al menos una cuota' })
  @ArrayMaxSize(60)
  @ValidateNested({ each: true })
  @Type(() => CuotaACobrarDto)
  cuotas: CuotaACobrarDto[];

  @ApiProperty({ description: 'Efectivo, transferencia, cheque, tarjeta…' }) @IsUUID() medio_pago_id: string;

  @ApiPropertyOptional({
    example: 'PYG',
    enum: ['PYG', 'USD'],
    description: 'En qué moneda paga el comprador. Por defecto, la de la venta.',
  })
  @IsOptional()
  @IsIn(['PYG', 'USD'])
  moneda_pago?: 'PYG' | 'USD';

  @ApiPropertyOptional({ description: 'Timbrado/punto de expedición; por defecto el de los parámetros' })
  @IsOptional()
  @IsUUID()
  numeracion_id?: string;
  @ApiPropertyOptional({ description: 'Sesión de caja abierta donde entra la plata' })
  @IsOptional()
  @IsUUID()
  sesion_caja_id?: string;
  @ApiPropertyOptional() @IsOptional() @IsUUID() tarjeta_id?: string;
  @ApiPropertyOptional() @IsOptional() @IsUUID() forma_procesamiento_pago_id?: string;
  @ApiPropertyOptional() @IsOptional() @IsString() @MaxLength(30) nro_autorizacion?: string;
  @ApiPropertyOptional() @IsOptional() @IsString() @MaxLength(30) numero_cheque?: string;
  @ApiPropertyOptional() @IsOptional() @IsString() @MaxLength(100) banco_emisor?: string;
}
