// Decimal Operations Helper Utilities
// Using Decimal.js for precise decimal arithmetic

import { Decimal } from 'decimal.js';

/**
 * Create Decimal from string or number
 */
export function toDecimal(value: string | number | Decimal): Decimal {
  if (value instanceof Decimal) {
    return value;
  }
  return new Decimal(value);
}

/**
 * Add two decimal values
 */
export function addDecimals(a: string | number | Decimal, b: string | number | Decimal): Decimal {
  return toDecimal(a).plus(toDecimal(b));
}

/**
 * Subtract two decimal values
 */
export function subtractDecimals(
  a: string | number | Decimal,
  b: string | number | Decimal
): Decimal {
  return toDecimal(a).minus(toDecimal(b));
}

/**
 * Multiply two decimal values
 */
export function multiplyDecimals(
  a: string | number | Decimal,
  b: string | number | Decimal
): Decimal {
  return toDecimal(a).times(toDecimal(b));
}

/**
 * Divide two decimal values
 */
export function divideDecimals(
  a: string | number | Decimal,
  b: string | number | Decimal
): Decimal {
  const divisor = toDecimal(b);
  if (divisor.isZero()) {
    throw new Error('Division by zero');
  }
  return toDecimal(a).dividedBy(divisor);
}

/**
 * Compare two decimal values
 * Returns: -1 if a < b, 0 if a === b, 1 if a > b
 */
export function compareDecimals(
  a: string | number | Decimal,
  b: string | number | Decimal
): number {
  const aDecimal = toDecimal(a);
  const bDecimal = toDecimal(b);
  
  if (aDecimal.lessThan(bDecimal)) return -1;
  if (aDecimal.greaterThan(bDecimal)) return 1;
  return 0;
}

/**
 * Check if decimal is zero
 */
export function isZero(value: string | number | Decimal): boolean {
  return toDecimal(value).isZero();
}

/**
 * Check if decimal is positive
 */
export function isPositive(value: string | number | Decimal): boolean {
  return toDecimal(value).isPositive();
}

/**
 * Check if decimal is negative
 */
export function isNegative(value: string | number | Decimal): boolean {
  return toDecimal(value).isNegative();
}

/**
 * Get absolute value
 */
export function abs(value: string | number | Decimal): Decimal {
  return toDecimal(value).abs();
}

/**
 * Round to specified decimal places
 */
export function round(value: string | number | Decimal, decimalPlaces: number = 2): Decimal {
  return toDecimal(value).toDecimalPlaces(decimalPlaces);
}

