export class Money {
  private constructor(
    public readonly amount: number,
    public readonly currency: string = 'USDT',
  ) {
    if (amount < 0) {
      throw new Error('金额不能为负数');
    }
  }

  static create(amount: number, currency: string = 'USDT'): Money {
    return new Money(amount, currency);
  }

  static zero(currency: string = 'USDT'): Money {
    return new Money(0, currency);
  }

  add(other: Money): Money {
    this.ensureSameCurrency(other);
    return new Money(this.amount + other.amount, this.currency);
  }

  subtract(other: Money): Money {
    this.ensureSameCurrency(other);
    if (this.amount < other.amount) {
      throw new Error('余额不足');
    }
    return new Money(this.amount - other.amount, this.currency);
  }

  multiply(factor: number): Money {
    return new Money(this.amount * factor, this.currency);
  }

  equals(other: Money): boolean {
    return this.amount === other.amount && this.currency === other.currency;
  }

  isGreaterThan(other: Money): boolean {
    this.ensureSameCurrency(other);
    return this.amount > other.amount;
  }

  isLessThan(other: Money): boolean {
    this.ensureSameCurrency(other);
    return this.amount < other.amount;
  }

  private ensureSameCurrency(other: Money): void {
    if (this.currency !== other.currency) {
      throw new Error(`货币类型不匹配: ${this.currency} vs ${other.currency}`);
    }
  }

  toString(): string {
    return `${this.amount} ${this.currency}`;
  }
}
