import { Injectable } from '@nestjs/common';
import { ReferralChain } from '../value-objects';

/**
 * 推荐链领域服务
 * 处理推荐链的构建和验证逻辑
 */
@Injectable()
export class ReferralChainService {
  private static readonly MAX_DEPTH = 1000;

  /**
   * 构建新用户的推荐链
   * @param referrerId 推荐人ID
   * @param parentChain 推荐人的推荐链
   */
  buildChain(referrerId: bigint | null, parentChain: bigint[] = []): ReferralChain {
    return ReferralChain.create(referrerId, parentChain);
  }

  /**
   * 验证推荐链是否有效
   * - 不能形成循环
   * - 深度不能超过限制
   */
  validateChain(chain: bigint[], newUserId: bigint): boolean {
    // 检查是否有循环
    if (chain.includes(newUserId)) {
      return false;
    }

    // 检查深度
    if (chain.length >= ReferralChainService.MAX_DEPTH) {
      return false;
    }

    return true;
  }

  /**
   * 获取需要更新团队统计的所有上级
   * @param chain 推荐链
   * @param maxLevels 最大层级 (默认全部)
   */
  getAncestorsForUpdate(chain: bigint[], maxLevels?: number): bigint[] {
    if (!maxLevels) {
      return [...chain];
    }
    return chain.slice(0, maxLevels);
  }

  /**
   * 计算用户在推荐链中的层级
   * @param chain 推荐链
   * @param ancestorId 上级ID
   * @returns 层级 (0 = 直推, 1 = 二级, ...), 如果不在链中返回 -1
   */
  getLevelInChain(chain: bigint[], ancestorId: bigint): number {
    const index = chain.findIndex((id) => id === ancestorId);
    return index;
  }
}
