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

import com.airlock.iam.base.api.domain.model.exception.FailureException;
import com.airlock.iam.base.api.domain.model.mapification.MapifiedValues;
import com.airlock.iam.base.domain.model.mapification.MapifiedValuesBuilder;
import com.airlock.iam.flow.api.domain.model.session.MultiFlowScopedFlowAttribute;
import com.airlock.iam.plugin.api.config.ConfigurationContext;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import java.util.Optional;

public final class MultiFlowConfigurationContext implements MultiFlowScopedFlowAttribute<MultiFlowConfigurationContext> {
   private static final String IDENTIFIER_KEY = "identifier";
   private final ConfigurationContext context;

   public MultiFlowConfigurationContext mergeWith(MultiFlowConfigurationContext newAttribute) {
      throw new FailureException("Initial configuration context cannot be changed.");
   }

   public static MultiFlowConfigurationContext multiFlowConfigurationContext(ConfigurationContext context) {
      return new MultiFlowConfigurationContext(context);
   }

   @Override
   public MapifiedValues mapify() {
      return MapifiedValuesBuilder.mapifiedValues().putIfPresent("identifier", Optional.ofNullable(this.context.getIdentifier())).build();
   }

   public static MultiFlowConfigurationContext demapify(MapifiedValues values) {
      return multiFlowConfigurationContext(
         values.transformOptional("identifier", ConfigurationContext::configurationContext).orElseGet(ConfigurationContext::defaultContext)
      );
   }

   @SuppressFBWarnings(justification = "generated code")
   private MultiFlowConfigurationContext(ConfigurationContext context) {
      this.context = context;
   }

   @SuppressFBWarnings(justification = "generated code")
   public ConfigurationContext getContext() {
      return this.context;
   }

   @SuppressFBWarnings(justification = "generated code")
   @Override
   public boolean equals(Object o) {
      if (o == this) {
         return true;
      } else if (!(o instanceof MultiFlowConfigurationContext other)) {
         return false;
      } else {
         Object this$context = this.context;
         Object other$context = other.context;
         return this$context == null ? other$context == null : this$context.equals(other$context);
      }
   }

   @SuppressFBWarnings(justification = "generated code")
   @Override
   public int hashCode() {
      int PRIME = 59;
      int result = 1;
      Object $context = this.context;
      return result * 59 + ($context == null ? 43 : $context.hashCode());
   }
}
