import {
  IsString,
  IsOptional,
  IsBoolean,
  IsNumber,
  IsEnum,
  IsDateString,
  MaxLength,
  Min,
} from 'class-validator';
import { TipoRecargo } from '../entities';

/**
 * DTO for creating a recargo
 */
export class CreateRecargoDto {
  @IsString()
  @MaxLength(50)
  codigo: string;

  @IsString()
  @MaxLength(200)
  nombre: string;

  @IsEnum(TipoRecargo)
  tipo: TipoRecargo;

  @IsOptional()
  @IsString()
  descripcion?: string;

  @IsOptional()
  @IsBoolean()
  esPorcentaje?: boolean;

  @IsNumber()
  monto: number;

  @IsOptional()
  @IsString()
  @MaxLength(3)
  moneda?: string;

  @IsOptional()
  @IsBoolean()
  aplicaAutomatico?: boolean;

  @IsOptional()
  @IsString()
  condicionAplicacion?: string;
}

/**
 * DTO for updating a recargo
 */
export class UpdateRecargoDto {
  @IsOptional()
  @IsString()
  @MaxLength(50)
  codigo?: string;

  @IsOptional()
  @IsString()
  @MaxLength(200)
  nombre?: string;

  @IsOptional()
  @IsEnum(TipoRecargo)
  tipo?: TipoRecargo;

  @IsOptional()
  @IsString()
  descripcion?: string;

  @IsOptional()
  @IsBoolean()
  esPorcentaje?: boolean;

  @IsOptional()
  @IsNumber()
  monto?: number;

  @IsOptional()
  @IsString()
  @MaxLength(3)
  moneda?: string;

  @IsOptional()
  @IsBoolean()
  aplicaAutomatico?: boolean;

  @IsOptional()
  @IsString()
  condicionAplicacion?: string;

  @IsOptional()
  @IsBoolean()
  activo?: boolean;
}

/**
 * DTO for creating a fuel surcharge
 */
export class CreateFuelSurchargeDto {
  @IsDateString()
  fechaInicio: string;

  @IsDateString()
  fechaFin: string;

  @IsOptional()
  @IsNumber()
  @Min(0)
  precioDieselReferencia?: number;

  @IsOptional()
  @IsNumber()
  @Min(0)
  precioDieselActual?: number;

  @IsNumber()
  @Min(0)
  porcentajeSurcharge: number;
}

/**
 * DTO for updating a fuel surcharge
 */
export class UpdateFuelSurchargeDto {
  @IsOptional()
  @IsDateString()
  fechaInicio?: string;

  @IsOptional()
  @IsDateString()
  fechaFin?: string;

  @IsOptional()
  @IsNumber()
  @Min(0)
  precioDieselReferencia?: number;

  @IsOptional()
  @IsNumber()
  @Min(0)
  precioDieselActual?: number;

  @IsOptional()
  @IsNumber()
  @Min(0)
  porcentajeSurcharge?: number;

  @IsOptional()
  @IsBoolean()
  activo?: boolean;
}
