/**
 * 龙虎榜分值值对象
 *
 * 计算公式: 团队总认种量 - 最大单个直推团队认种量
 *
 * 目的:
 * - 鼓励均衡发展团队，而不是只依赖单个大团队
 * - 防止"烧伤"现象（单腿发展）
 */
export class RankingScore {
  private constructor(
    public readonly totalTeamPlanting: number,      // 团队总认种量
    public readonly maxDirectTeamPlanting: number,  // 最大单个直推团队认种量
    public readonly effectiveScore: number,         // 有效分值（龙虎榜分值）
  ) {}

  /**
   * 计算龙虎榜分值
   *
   * @param totalTeamPlanting - 团队总认种量
   * @param maxDirectTeamPlanting - 最大单个直推团队认种量
   * @returns RankingScore 实例
   *
   * @example
   * // 用户A的团队数据：
   * // - 直推B的团队认种: 100棵
   * // - 直推C的团队认种: 80棵
   * // - 直推D的团队认种: 50棵
   * // - 团队总认种: 230棵
   * // - 最大单个直推团队: 100棵 (B)
   * // - 龙虎榜分值: 230 - 100 = 130
   *
   * const score = RankingScore.calculate(230, 100);
   * // score.effectiveScore === 130
   */
  static calculate(
    totalTeamPlanting: number,
    maxDirectTeamPlanting: number,
  ): RankingScore {
    const effectiveScore = Math.max(0, totalTeamPlanting - maxDirectTeamPlanting);
    return new RankingScore(totalTeamPlanting, maxDirectTeamPlanting, effectiveScore);
  }

  /**
   * 创建零分值
   */
  static zero(): RankingScore {
    return new RankingScore(0, 0, 0);
  }

  /**
   * 从原始数据重建
   */
  static fromRaw(
    totalTeamPlanting: number,
    maxDirectTeamPlanting: number,
    effectiveScore: number,
  ): RankingScore {
    return new RankingScore(totalTeamPlanting, maxDirectTeamPlanting, effectiveScore);
  }

  /**
   * 比较分值（用于排序）
   * @returns 负数表示 this > other，正数表示 this < other，0 表示相等
   */
  compareTo(other: RankingScore): number {
    return other.effectiveScore - this.effectiveScore;
  }

  /**
   * 判断分值是否相等
   */
  equals(other: RankingScore): boolean {
    return this.effectiveScore === other.effectiveScore;
  }

  /**
   * 判断是否有有效分值
   */
  hasEffectiveScore(): boolean {
    return this.effectiveScore > 0;
  }

  /**
   * 计算大腿占比（最大团队占总团队的比例）
   */
  getMaxTeamRatio(): number {
    if (this.totalTeamPlanting === 0) return 0;
    return this.maxDirectTeamPlanting / this.totalTeamPlanting;
  }

  /**
   * 判断是否为健康的团队结构（大腿占比低于50%）
   */
  isHealthyTeamStructure(): boolean {
    return this.getMaxTeamRatio() < 0.5;
  }

  toString(): string {
    return `RankingScore(total=${this.totalTeamPlanting}, max=${this.maxDirectTeamPlanting}, effective=${this.effectiveScore})`;
  }
}
