package com.airlock.iam.plugin.configeditor.data;

import com.airlock.iam.plugin.api.config.ConfigurationContext;
import com.airlock.iam.plugin.api.property.PropertyConfiguration;
import com.airlock.iam.plugin.api.util.PropertyDisplayNameReader;
import com.airlock.iam.plugin.framework.application.configuration.MutablePluginConfiguration;
import com.airlock.iam.plugin.framework.misc.config.PropertyConfigurationWithPluginConfiguration;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import java.util.Objects;

public class EnvironmentSpecificPropertyBean {
   private final MutablePluginConfiguration pluginConfiguration;
   private final PropertyConfiguration propertyConfiguration;
   private final ConfigurationContext configurationContext;

   public EnvironmentSpecificPropertyBean(PropertyConfigurationWithPluginConfiguration property) {
      this.pluginConfiguration = (MutablePluginConfiguration)property.getPluginConfiguration();
      this.propertyConfiguration = property.getPropertyConfiguration();
      this.configurationContext = property.getConfigurationContext();
   }

   public String getPluginNameAndId() {
      return this.pluginConfiguration.getClassNameAndDisplayName();
   }

   public String getContextName() {
      return this.configurationContext.toString();
   }

   public String getPropertyName() {
      return PropertyDisplayNameReader.propertyDisplayName(this.pluginConfiguration, this.propertyConfiguration.getName());
   }

   @Override
   public boolean equals(Object o) {
      if (this == o) {
         return true;
      } else if (o != null && this.getClass() == o.getClass()) {
         EnvironmentSpecificPropertyBean that = (EnvironmentSpecificPropertyBean)o;
         return this.pluginConfiguration == that.pluginConfiguration
            && this.propertyConfiguration == that.propertyConfiguration
            && Objects.equals(this.configurationContext, that.configurationContext);
      } else {
         return false;
      }
   }

   @Override
   public int hashCode() {
      return Objects.hash(
         System.identityHashCode(this.pluginConfiguration),
         System.identityHashCode(this.propertyConfiguration),
         System.identityHashCode(this.configurationContext)
      );
   }

   @SuppressFBWarnings(justification = "generated code")
   public MutablePluginConfiguration getPluginConfiguration() {
      return this.pluginConfiguration;
   }

   @SuppressFBWarnings(justification = "generated code")
   public PropertyConfiguration getPropertyConfiguration() {
      return this.propertyConfiguration;
   }

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