package com.social.media.domain.shared;

import lombok.AccessLevel;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;

import java.time.LocalDateTime;
import java.util.UUID;

/**
 * Base implementation for Domain Events
 * 
 * Provides common functionality for all domain events
 * including event identification and timing.
 * 
 * @author Social Media Manager Team
 * @since 2.0.0
 */
@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@AllArgsConstructor(access = AccessLevel.PROTECTED)
public abstract class BaseDomainEvent implements DomainEvent {
    
    private UUID eventId;
    private LocalDateTime occurredOn;
    private String aggregateId;
    private String aggregateType;
    
    /**
     * Constructor for creating domain events
     */
    protected BaseDomainEvent(String aggregateId, String aggregateType) {
        this.eventId = UUID.randomUUID();
        this.occurredOn = LocalDateTime.now();
        this.aggregateId = aggregateId;
        this.aggregateType = aggregateType;
    }
    
    @Override
    public String toString() {
        return String.format("%s{eventId=%s, aggregateId=%s, aggregateType=%s, occurredOn=%s}", 
            getClass().getSimpleName(), eventId, aggregateId, aggregateType, occurredOn);
    }
}
