export function roundToWholeNumber(value: number): number {
  return Math.round(value);
}

export function roundToDecimalPlaces(value: number, places: number): number {
  const factor = Math.pow(10, places);
  return Math.round(value * factor) / factor;
}

export function roundToSignificantFigures(value: number, sigFigs: number): number {
  if (value === 0) return 0;
  const magnitude = Math.floor(Math.log10(Math.abs(value)));
  const factor = Math.pow(10, sigFigs - 1 - magnitude);
  return Math.round(value * factor) / factor;
}

export function toStandardForm(value: number): { coefficient: number; exponent: number } {
  if (value === 0) return { coefficient: 0, exponent: 0 };
  const exponent = Math.floor(Math.log10(Math.abs(value)));
  const coefficient = value / Math.pow(10, exponent);
  return {
    coefficient: roundToDecimalPlaces(coefficient, 10),
    exponent,
  };
}

export function fromStandardForm(coefficient: number, exponent: number): number {
  return coefficient * Math.pow(10, exponent);
}

export function compareDecimals(a: number, b: number): -1 | 0 | 1 {
  if (a > b) return 1;
  if (a < b) return -1;
  return 0;
}

export function getPlaceValue(value: number): { digit: number; place: string }[] {
  const places = [
    "thousands", "hundreds", "tens", "units", "tenths", "hundredths", "thousandths",
  ];
  const str = Math.abs(value).toFixed(3);
  const [intPart, decPart] = str.split(".");
  const paddedInt = intPart.padStart(4, "0");
  const result: { digit: number; place: string }[] = [];

  for (let i = 0; i < 4; i++) {
    result.push({ digit: parseInt(paddedInt[i]), place: places[i] });
  }
  for (let i = 0; i < 3; i++) {
    result.push({ digit: parseInt(decPart[i]), place: places[4 + i] });
  }
  return result;
}

export function multiplyByPowerOf10(value: number, power: number): number {
  return roundToDecimalPlaces(value * Math.pow(10, power), 10);
}

export function divideByPowerOf10(value: number, power: number): number {
  return roundToDecimalPlaces(value / Math.pow(10, power), 10);
}

export function standardFormToKatex(coefficient: number, exponent: number): string {
  return `${coefficient} \\times 10^{${exponent}}`;
}
