package com.qqchen.deploy.backend.framework.domain;

import com.qqchen.deploy.backend.framework.event.DomainEvent;
import org.springframework.data.domain.AfterDomainEventPublication;
import org.springframework.data.domain.DomainEvents;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

public abstract class AggregateRoot<ID extends Serializable> extends Entity<ID> {

    private transient final List<DomainEvent> domainEvents = new ArrayList<>();

    /**
     * 注册领域事件
     */
    protected void registerDomainEvent(DomainEvent event) {
        if (event != null) {
            domainEvents.add(event);
        }
    }

    /**
     * 获取并清除所有事件
     */
    @DomainEvents
    protected Collection<DomainEvent> domainEvents() {
        List<DomainEvent> events = new ArrayList<>(this.domainEvents);
        this.domainEvents.clear();
        return events;
    }

    /**
     * Spring Data JPA会在事件发布后调用此方法
     */
    @AfterDomainEventPublication
    protected void clearDomainEvents() {
        this.domainEvents.clear();
    }

    /**
     * 验证聚合根状态
     * 子类可以重写此方法实现具体的验证逻辑
     */
    protected void validateState() {
        // 默认实现为空，由子类根据需要重写
    }

    /**
     * 在保存前验证状态
     */
    public void validateBeforeSave() {
        validateState();
    }

    /**
     * 在更新前验证状态
     */
    public void validateBeforeUpdate() {
        validateState();
    }

    /**
     * 在删除前验证状态
     */
    public void validateBeforeDelete() {
        // 子类可以重写此方法添加删除前的验证
    }
} 