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

export class CrearListaPreciosDto {
  @ApiProperty({ description: 'Código único de la lista', maxLength: 20 })
  @IsString()
  @MaxLength(20)
  codigo: string;

  @ApiProperty({ description: 'Nombre de la lista de precios', maxLength: 100 })
  @IsString()
  @MaxLength(100)
  nombre: string;

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

  @ApiPropertyOptional({
    description: 'Tipo de aplicación de la lista',
    enum: ['general', 'cliente', 'zona', 'canal'],
    default: 'general',
  })
  @IsOptional()
  @IsIn(['general', 'cliente', 'zona', 'canal'])
  tipoAplicacion?: string;

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

  @ApiPropertyOptional({
    description: 'Prioridad de la lista (menor número = mayor prioridad)',
    default: 1,
  })
  @IsOptional()
  @IsNumber()
  @Min(1)
  prioridad?: number;

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

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

  @ApiPropertyOptional({
    description: 'Si aplica descuento general',
    default: false,
  })
  @IsOptional()
  @IsBoolean()
  aplicaDescuentoGeneral?: boolean;

  @ApiPropertyOptional({
    description: 'Porcentaje de descuento general',
    default: 0,
  })
  @IsOptional()
  @IsNumber()
  @Min(0)
  @Max(100)
  descuentoPorcentaje?: number;

  @ApiPropertyOptional({
    description: 'Si aplica recargo general',
    default: false,
  })
  @IsOptional()
  @IsBoolean()
  aplicaRecargoGeneral?: boolean;

  @ApiPropertyOptional({
    description: 'Porcentaje de recargo general',
    default: 0,
  })
  @IsOptional()
  @IsNumber()
  @Min(0)
  @Max(100)
  recargoPorcentaje?: number;

  @ApiPropertyOptional({
    description: 'Si está activo el redondeo',
    default: false,
  })
  @IsOptional()
  @IsBoolean()
  redondeoActivo?: boolean;

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

  @ApiPropertyOptional({
    description: 'Cantidad de decimales para redondeo',
    default: 0,
  })
  @IsOptional()
  @IsNumber()
  @Min(0)
  @Max(4)
  redondeoDecimales?: number;
}
