/**
 * ReferralChain Value Object
 * 推荐链: 存储从直接推荐人到顶层的有序 userId 数组
 * chain[0] = 直接推荐人, chain[1] = 推荐人的推荐人, ...
 */
export class ReferralChain {
  private static readonly MAX_DEPTH = 50;

  private constructor(private readonly _chain: string[]) {
    if (_chain.length > ReferralChain.MAX_DEPTH) {
      throw new Error(`推荐链深度不能超过 ${ReferralChain.MAX_DEPTH}`);
    }
  }

  static empty(): ReferralChain {
    return new ReferralChain([]);
  }

  static fromArray(chain: string[]): ReferralChain {
    return new ReferralChain([...chain]);
  }

  /**
   * 构建新用户的推荐链: 将推荐人 prepend 到其推荐链前
   */
  static buildFromReferrer(referrerId: string, referrerChain: string[]): ReferralChain {
    const chain = [referrerId, ...referrerChain];
    return new ReferralChain(chain.slice(0, ReferralChain.MAX_DEPTH));
  }

  get depth(): number {
    return this._chain.length;
  }

  /** 直接推荐人 (chain[0]) */
  get directReferrer(): string | null {
    return this._chain[0] ?? null;
  }

  /** 获取第 N 级上级 (1-based, 1 = 直接推荐人) */
  getReferrerAtLevel(level: number): string | null {
    return this._chain[level - 1] ?? null;
  }

  /** 所有祖先 */
  getAllAncestors(): string[] {
    return [...this._chain];
  }

  toArray(): string[] {
    return [...this._chain];
  }

  /** 检查 userId 是否已在链中 (防止循环推荐) */
  contains(userId: string): boolean {
    return this._chain.includes(userId);
  }
}
