import Decimal from 'decimal.js';

/**
 * 积分股数量值对象
 * 支持高精度计算
 */
export class ShareAmount {
  private readonly _value: Decimal;

  constructor(value: Decimal | string | number) {
    if (value instanceof Decimal) {
      this._value = value;
    } else {
      this._value = new Decimal(value);
    }

    if (this._value.isNegative()) {
      throw new Error('Share amount cannot be negative');
    }
  }

  get value(): Decimal {
    return this._value;
  }

  add(other: ShareAmount): ShareAmount {
    return new ShareAmount(this._value.plus(other._value));
  }

  subtract(other: ShareAmount): ShareAmount {
    const result = this._value.minus(other._value);
    if (result.isNegative()) {
      throw new Error('Insufficient share amount');
    }
    return new ShareAmount(result);
  }

  multiply(factor: Decimal | string | number): ShareAmount {
    return new ShareAmount(this._value.times(factor));
  }

  divide(divisor: Decimal | string | number): ShareAmount {
    return new ShareAmount(this._value.dividedBy(divisor));
  }

  isZero(): boolean {
    return this._value.isZero();
  }

  isGreaterThan(other: ShareAmount): boolean {
    return this._value.greaterThan(other._value);
  }

  isLessThan(other: ShareAmount): boolean {
    return this._value.lessThan(other._value);
  }

  isGreaterThanOrEqual(other: ShareAmount): boolean {
    return this._value.greaterThanOrEqualTo(other._value);
  }

  equals(other: ShareAmount): boolean {
    return this._value.equals(other._value);
  }

  toFixed(decimals: number = 8): string {
    return this._value.toFixed(decimals);
  }

  toString(): string {
    return this._value.toString();
  }

  static zero(): ShareAmount {
    return new ShareAmount(0);
  }

  static fromString(value: string): ShareAmount {
    return new ShareAmount(value);
  }
}
