import { DomainEvent } from '@/domain/events/domain-event.base';

/**
 * 聚合根基类
 *
 * 所有聚合根都应继承此基类，统一管理领域事件的收集和清理。
 */
export abstract class AggregateRoot<TId = bigint> {
  protected readonly _domainEvents: DomainEvent[] = [];

  /**
   * 聚合根唯一标识
   */
  abstract get id(): TId | undefined;

  /**
   * 获取所有待发布的领域事件
   */
  get domainEvents(): ReadonlyArray<DomainEvent> {
    return [...this._domainEvents];
  }

  /**
   * 添加领域事件
   * @param event 领域事件
   */
  protected addDomainEvent(event: DomainEvent): void {
    this._domainEvents.push(event);
  }

  /**
   * 清空领域事件（在事件发布后调用）
   */
  clearDomainEvents(): void {
    this._domainEvents.length = 0;
  }

  /**
   * 检查是否有待发布的领域事件
   */
  hasDomainEvents(): boolean {
    return this._domainEvents.length > 0;
  }
}
