package com.airlock.iam.base.domain.model.event;

import com.airlock.iam.base.api.domain.model.event.DomainEvent;
import com.airlock.iam.base.api.domain.model.event.EventId;
import com.airlock.iam.base.api.domain.model.event.metadata.EventMetadata;
import com.airlock.iam.base.api.domain.model.event.source.EventSource;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import java.time.Instant;
import lombok.NonNull;

public abstract class AbstractDomainEvent implements DomainEvent {
   @NonNull
   private final EventCreationData eventCreationData;
   @NonNull
   private final String displayName;

   @Override
   public EventId id() {
      return this.eventCreationData.id();
   }

   @Override
   public Instant createdAt() {
      return this.eventCreationData.createdAt();
   }

   @Override
   public EventSource source() {
      return this.eventCreationData.source();
   }

   @Override
   public EventMetadata metadata() {
      return this.eventCreationData.metadata();
   }

   @Override
   public String displayName() {
      return this.displayName;
   }

   @SuppressFBWarnings(justification = "generated code")
   public AbstractDomainEvent(@NonNull EventCreationData eventCreationData, @NonNull String displayName) {
      if (eventCreationData == null) {
         throw new NullPointerException("eventCreationData is marked non-null but is null");
      }

      if (displayName == null) {
         throw new NullPointerException("displayName is marked non-null but is null");
      }

      this.eventCreationData = eventCreationData;
      this.displayName = displayName;
   }
}
