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

export class CrearPlanCuotasDto {
  @ApiPropertyOptional({
    description:
      'ID de la empresa (se asigna automáticamente del usuario autenticado)',
  })
  @IsOptional()
  @IsUUID()
  empresaId?: string;

  @ApiProperty({ description: 'Código único del plan', maxLength: 20 })
  @IsString()
  @MaxLength(20)
  codigo: string;

  @ApiProperty({ description: 'Nombre del plan', maxLength: 100 })
  @IsString()
  @MaxLength(100)
  nombre: string;

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

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

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

  @ApiProperty({ description: 'Intervalo en días entre cuotas', default: 30 })
  @IsNumber()
  @Min(1)
  @Max(365)
  intervaloDias: number = 30;

  @ApiProperty({
    description:
      'Tasa Efectiva Anual (TEA) en %. Es el costo real del año: la tasa del período se ' +
      'deriva por equivalencia según `intervaloDias` (ver calculo-interes.util.ts). ' +
      'Admite más de 100% — en plazas de alta inflación una TEA de 3 dígitos es normal ' +
      '(ej. 8% mensual equivale a ~155% TEA).',
    default: 0,
  })
  @IsNumber()
  @Min(0)
  @Max(1000)
  tasaInteres: number = 0;

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

  @ApiProperty({ description: 'Requiere cuota inicial', default: false })
  @IsBoolean()
  cuotaInicialRequerida: boolean = false;

  @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;

  @ApiProperty({ description: 'Plan activo', default: true })
  @IsBoolean()
  activo: boolean = true;

  @ApiProperty({ description: 'Es plan por defecto', default: false })
  @IsBoolean()
  esDefault: boolean = false;
}
