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

export class CrearReglaPrecioDto {
  @ApiProperty({ description: 'Nombre de la regla', maxLength: 100 })
  @IsString()
  @MaxLength(100)
  nombre: string;

  @ApiPropertyOptional({ description: 'Prioridad (mayor número = gana el desempate)', default: 1 })
  @IsOptional()
  @IsNumber()
  @Min(1)
  prioridad?: number;

  @ApiPropertyOptional({
    description: "Ámbito de la regla. 'global' y 'categoria' están soportados; 'marca' y 'producto' quedan reservados para una fase futura.",
    enum: ['global', 'categoria', 'marca', 'producto'],
    default: 'global',
  })
  @IsOptional()
  @IsIn(['global', 'categoria', 'marca', 'producto'])
  alcance?: string;

  @ApiPropertyOptional({ description: 'ID de categoría (cuando alcance=categoria)' })
  @IsOptional()
  @IsUUID()
  categoriaId?: string;

  @ApiPropertyOptional({ description: 'ID de marca (cuando alcance=marca)' })
  @IsOptional()
  @IsUUID()
  marcaId?: string;

  @ApiPropertyOptional({ description: 'ID de producto (cuando alcance=producto)' })
  @IsOptional()
  @IsUUID()
  productoId?: string;

  @ApiPropertyOptional({ description: 'Código de moneda ISO', maxLength: 3, default: 'PYG' })
  @IsOptional()
  @IsString()
  @MaxLength(3)
  moneda?: string;

  @ApiProperty({ description: 'Costo desde (inclusive)', default: 0 })
  @IsNumber()
  @Min(0)
  costoDesde: number;

  @ApiPropertyOptional({ description: 'Costo hasta (exclusive). Vacío = sin tope superior' })
  @IsOptional()
  @IsNumber()
  @Min(0)
  costoHasta?: number;

  @ApiPropertyOptional({
    description: 'Método de cálculo del precio',
    enum: ['margen_sobre_costo', 'margen_sobre_precio', 'precio_fijo'],
    default: 'margen_sobre_costo',
  })
  @IsOptional()
  @IsIn(['margen_sobre_costo', 'margen_sobre_precio', 'precio_fijo'])
  metodo?: string;

  @ApiProperty({ description: 'Valor del método: % de margen/markup, o monto si es precio_fijo' })
  @IsNumber()
  valor: number;

  @ApiPropertyOptional({ description: 'Si aplica redondeo al precio resultante', default: true })
  @IsOptional()
  @IsBoolean()
  redondeoActivo?: boolean;

  @ApiPropertyOptional({
    description: 'Tipo de redondeo',
    enum: ['superior', 'normal', 'inferior'],
    default: 'superior',
  })
  @IsOptional()
  @IsIn(['superior', 'normal', 'inferior'])
  redondeoTipo?: string;

  @ApiPropertyOptional({ description: 'Redondear a múltiplos de este valor', default: 1000 })
  @IsOptional()
  @IsNumber()
  @Min(1)
  redondeoMultiplo?: number;

  @ApiProperty({ description: 'ID de la lista de precios destino (donde se escribe el precio contado)' })
  @IsUUID()
  listaPreciosId: string;

  @ApiPropertyOptional({ description: 'Fecha de inicio de vigencia' })
  @IsOptional()
  @IsDateString()
  fechaInicio?: string;

  @ApiPropertyOptional({ description: 'Fecha de fin de vigencia' })
  @IsOptional()
  @IsDateString()
  fechaFin?: string;
}
