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

export class ActualizarPlanCuotasDto {
  @ApiPropertyOptional({ description: 'Nombre del plan', maxLength: 100 })
  @IsOptional()
  @IsString()
  @MaxLength(100)
  nombre?: string;

  @ApiPropertyOptional({ description: 'Descripción del plan' })
  @IsOptional()
  @IsString()
  descripcion?: string;

  @ApiPropertyOptional({ 
    description: 'Tipo de cálculo', 
    enum: ['manual', 'automatico', 'mixto']
  })
  @IsOptional()
  @IsIn(['manual', 'automatico', 'mixto'])
  tipoCalculo?: string;

  @ApiPropertyOptional({ description: 'Cantidad de cuotas (para tipo automático)' })
  @IsOptional()
  @IsNumber()
  @Min(1)
  @Max(60)
  cantidadCuotas?: number;

  @ApiPropertyOptional({ description: 'Intervalo en días entre cuotas' })
  @IsOptional()
  @IsNumber()
  @Min(1)
  @Max(365)
  intervaloDias?: number;

  @ApiPropertyOptional({
    description:
      'Tasa Efectiva Anual (TEA) en %. Admite más de 100% (ver crear-plan-cuotas.dto.ts).',
  })
  @IsOptional()
  @IsNumber()
  @Min(0)
  @Max(1000)
  tasaInteres?: number;

  @ApiPropertyOptional({ 
    description: 'Tipo de interés', 
    enum: ['simple', 'compuesto', 'frances']
  })
  @IsOptional()
  @IsIn(['simple', 'compuesto', 'frances'])
  tipoInteres?: string;

  @ApiPropertyOptional({ description: 'Requiere cuota inicial' })
  @IsOptional()
  @IsBoolean()
  cuotaInicialRequerida?: boolean;

  @ApiPropertyOptional({ description: 'Porcentaje mínimo de cuota inicial' })
  @IsOptional()
  @IsNumber()
  @Min(0)
  @Max(100)
  cuotaInicialMinima?: number;

  @ApiPropertyOptional({ description: 'Monto mínimo para aplicar el plan' })
  @IsOptional()
  @IsNumber()
  @Min(0)
  montoMinimo?: number;

  @ApiPropertyOptional({ description: 'Monto máximo para aplicar el plan' })
  @IsOptional()
  @IsNumber()
  @Min(0)
  montoMaximo?: number;

  @ApiPropertyOptional({
    description:
      'Categoría (específica o padre) a la que se acota este plan en la grilla automática de cuotas. Vacío = aplica a cualquier categoría, igual que antes de esta opción.',
  })
  @IsOptional()
  @IsUUID()
  categoriaId?: string;

  @ApiPropertyOptional({
    description:
      'Precio de catálogo (contado) del producto desde el cual este plan entra en la grilla automática. No confundir con montoMinimo (que valida el monto de la venta).',
  })
  @IsOptional()
  @IsNumber()
  @Min(0)
  precioProductoDesde?: number;

  @ApiPropertyOptional({
    description: 'Precio de catálogo (contado) del producto hasta el cual este plan entra en la grilla automática. Vacío = sin tope superior.',
  })
  @IsOptional()
  @IsNumber()
  @Min(0)
  precioProductoHasta?: number;

  @ApiPropertyOptional({ description: 'Plan activo' })
  @IsOptional()
  @IsBoolean()
  activo?: boolean;

  @ApiPropertyOptional({ description: 'Es plan por defecto' })
  @IsOptional()
  @IsBoolean()
  esDefault?: boolean;
}
