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

export class CuotaPersonalizadaDto {
  @ApiProperty({ description: 'Monto de la cuota' })
  @IsNumber()
  @Min(0)
  monto: number;

  @ApiPropertyOptional({ description: 'Días de vencimiento', default: 30 })
  @IsOptional()
  @IsNumber()
  @Min(1)
  diasVencimiento?: number;

  @ApiPropertyOptional({ description: 'Descripción de la cuota' })
  @IsOptional()
  @IsString()
  descripcion?: string;
}

export class CalcularCuotasDto {
  @ApiProperty({ description: 'ID del plan de cuotas' })
  @IsUUID()
  planCuotaId: string;

  @ApiProperty({ description: 'Monto total a financiar' })
  @IsNumber()
  @Min(0)
  montoTotal: number;

  @ApiPropertyOptional({ description: 'ID del cliente' })
  @IsOptional()
  @IsUUID()
  clienteId?: string;

  @ApiPropertyOptional({ description: 'ID de la factura' })
  @IsOptional()
  @IsUUID()
  facturaId?: string;

  @ApiPropertyOptional({ description: 'Moneda de la operación (ISO), default la moneda principal de la empresa' })
  @IsOptional()
  @IsString()
  monedaIso?: string;

  @ApiPropertyOptional({
    description:
      "Cantidad de cuotas a usar (solo para planes 'automatico'). El plan define la cantidad MÁXIMA " +
      '(cantidad_cuotas); si se omite, se usa ese máximo. No puede superar el máximo del plan.',
  })
  @IsOptional()
  @IsNumber()
  @Min(1)
  cantidadCuotas?: number;

  @ApiPropertyOptional({
    description: 'Cuotas personalizadas para planes manuales',
    type: [CuotaPersonalizadaDto],
  })
  @ApiPropertyOptional({ description: 'Observaciones adicionales' })
  @IsOptional()
  @IsString()
  observaciones?: string;

  @ApiPropertyOptional({ description: 'Monto de cuota inicial' })
  @IsOptional()
  @IsNumber()
  cuotaInicial?: number;
  @IsOptional()
  @IsArray()
  @ValidateNested({ each: true })
  @Type(() => CuotaPersonalizadaDto)
  cuotasPersonalizadas?: CuotaPersonalizadaDto[];
}
