package com.airlock.iam.flow.shared.domain.model.event;

import com.airlock.iam.base.api.domain.model.event.EventType;
import com.airlock.iam.base.api.domain.model.user.UserId;
import com.airlock.iam.base.domain.model.event.EventCreationData;
import com.airlock.iam.common.domain.model.event.AbstractUserEvent;
import com.airlock.iam.flow.api.domain.model.step.StepAction;
import com.airlock.iam.flow.api.domain.model.step.StepError;
import com.airlock.iam.flow.api.domain.model.step.StepResult;
import com.airlock.iam.flow.domain.model.event.FlowEventTypes;
import com.airlock.iam.flow.domain.model.event.GenericStepResultEvent;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import java.util.Map;
import java.util.Optional;

public class GenericStepResultUserEvent extends AbstractUserEvent implements GenericStepResultEvent {
   private final StepResult.StepResultType stepResultType;
   private final Optional<StepError> stepError;
   private final Optional<StepAction> stepAction;
   private final Map<String, Object> additionalAttributes;

   public GenericStepResultUserEvent(
      EventCreationData eventCreationData,
      UserId userId,
      StepResult.StepResultType stepResultType,
      Optional<StepError> stepError,
      Optional<StepAction> stepAction,
      Map<String, Object> additionalAttributes
   ) {
      super(eventCreationData, "Generic Step Result With User", userId);
      this.stepResultType = stepResultType;
      this.stepError = stepError;
      this.stepAction = stepAction;
      this.additionalAttributes = additionalAttributes;
   }

   @Override
   public EventType type() {
      return FlowEventTypes.GENERIC_STEP_RESULT;
   }

   @SuppressFBWarnings(justification = "generated code")
   @Override
   public StepResult.StepResultType stepResultType() {
      return this.stepResultType;
   }

   @SuppressFBWarnings(justification = "generated code")
   @Override
   public Optional<StepError> stepError() {
      return this.stepError;
   }

   @SuppressFBWarnings(justification = "generated code")
   @Override
   public Optional<StepAction> stepAction() {
      return this.stepAction;
   }

   @SuppressFBWarnings(justification = "generated code")
   @Override
   public Map<String, Object> additionalAttributes() {
      return this.additionalAttributes;
   }
}
