import { QuantityDTO } from "../dto";

const isEmptyQuantityDTO = (dto?: QuantityDTO | null) =>
  !dto || dto.value?.trim?.() === "" || dto.scale?.trim?.() === "";

/**
 * Convierte un QuantityDTO a número con precisión.
 */
const toNumber = (dto?: QuantityDTO | null, fallbackScale = 2): number => {
  if (isEmptyQuantityDTO(dto)) {
    return 0;
  }
  const scale = Number(dto!.scale || fallbackScale);
  return Number(dto!.value || 0) / 10 ** scale;
};

/**
 * Convierte un QuantityDTO a cadena numérica con precisión.
 * Puede devolver cadena vacía
 */
const toNumericString = (dto?: QuantityDTO | null, fallbackScale = 2): string => {
  if (isEmptyQuantityDTO(dto)) {
    return "";
  }
  return toNumber(dto, fallbackScale).toString();
};

/**
 * Convierte número a QuantityDTO.
 */
const fromNumber = (amount: number, scale = 2): QuantityDTO => {
  return {
    value: String(Math.round(amount * 10 ** scale)),
    scale: String(scale),
  };
};

/**
 * Convierte cadena numérica a QuantityDTO.
 */
const fromNumericString = (amount?: string, scale = 2): QuantityDTO => {
  if (!amount || amount?.trim?.() === "") {
    return {
      value: "",
      scale: String(scale),
    };
  }
  return {
    value: String(Math.round(Number(amount) * 10 ** scale)),
    scale: String(scale),
  };
};

export const QuantityDTOHelper = {
  isEmpty: isEmptyQuantityDTO,
  toNumber,
  toNumericString,
  fromNumber,
  fromNumericString,
};
