/**
 * 排名位置值对象
 *
 * 封装排名相关的业务逻辑
 */
export class RankPosition {
  private constructor(
    public readonly value: number,
  ) {
    if (value < 1) {
      throw new Error('排名必须大于0');
    }
  }

  /**
   * 创建排名位置
   */
  static create(value: number): RankPosition {
    return new RankPosition(value);
  }

  /**
   * 是否在前N名
   */
  isTop(n: number): boolean {
    return this.value <= n;
  }

  /**
   * 是否是第一名
   */
  isFirst(): boolean {
    return this.value === 1;
  }

  /**
   * 是否在前三名
   */
  isTopThree(): boolean {
    return this.value <= 3;
  }

  /**
   * 计算排名变化
   * @returns 正数表示上升，负数表示下降，0表示不变
   */
  calculateChange(previousRank: RankPosition | null): number {
    if (!previousRank) return 0;
    return previousRank.value - this.value;
  }

  /**
   * 获取排名变化描述
   */
  getChangeDescription(previousRank: RankPosition | null): string {
    const change = this.calculateChange(previousRank);
    if (change > 0) return `↑${change}`;
    if (change < 0) return `↓${Math.abs(change)}`;
    return '-';
  }

  /**
   * 判断是否比另一个排名靠前
   */
  isBetterThan(other: RankPosition): boolean {
    return this.value < other.value;
  }

  /**
   * 判断是否相等
   */
  equals(other: RankPosition): boolean {
    return this.value === other.value;
  }

  toString(): string {
    return `第${this.value}名`;
  }
}
