import BigNumberJS from "bignumber.js";
import { BigNumber, utils } from "ethers";

export const safeBigNumberFrom = (value: string) => {
  BigNumberJS.config({ DECIMAL_PLACES: 0 });
  return BigNumber.from(new BigNumberJS(value).div(1).toFixed());
};

export const weiToHumanReadable = ({
  amount,
  decimals,
  precisionFractionalPlaces,
  prettifySmallNumber = false,
}: {
  amount: string;
  decimals: number;
  precisionFractionalPlaces: number;
  prettifySmallNumber?: boolean;
}): string => {
  const decimalsFactor = Math.pow(10, decimals);

  BigNumberJS.config({ DECIMAL_PLACES: precisionFractionalPlaces });

  const res = new BigNumberJS(amount).div(decimalsFactor).toFixed();
  if (prettifySmallNumber && res === "0" && amount !== "0") {
    return `<${(1 / 10 ** precisionFractionalPlaces).toFixed(
      precisionFractionalPlaces,
    )}`;
  }
  return res;
};

export const humanReadableToWei = ({
  amount,
  decimals,
}: {
  amount: string;
  decimals: number;
}): string => {
  const decimalsFactor = Math.pow(10, decimals);
  const parsedAmount = new BigNumberJS(amount || "0");
  return safeBigNumberFrom(
    parsedAmount.mul(decimalsFactor).toFixed(),
  ).toString();
};

export const generateRandomBigNumber = (length: number) => {
  return BigNumber.from(utils.randomBytes(length));
};

export const generateUniqueRandomBigNumber = (
  length: number,
  // eslint-disable-next-line
  existingValues: any[],
) => {
  let result;
  while (result === undefined || existingValues.includes(result)) {
    result = generateRandomBigNumber(length);
  }
  return result;
};
