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

import com.airlock.iam.core.misc.util.config.Config;
import com.airlock.iam.plugin.api.config.ConfigurationEnvironment;
import com.airlock.iam.plugin.api.exception.ConfigurationException;
import com.airlock.iam.plugin.framework.application.configuration.MutablePluginConfiguration;
import com.airlock.iam.plugin.framework.misc.config.PluginConfigurationDictionary;
import com.airlock.iam.plugin.framework.misc.config.PropertyConfigurationWithPluginConfiguration;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import java.util.Collections;
import java.util.Optional;
import java.util.Set;
import java.util.stream.Stream;

public class ConfigEditorState {
   private ConfigContainer configContainer;
   private MutablePluginConfiguration selectedConfiguration;
   private MutablePluginConfiguration lastValidatedConfiguration;
   private final ConfigurationEnvironment instanceEnvironment = Config.getInstanceEnvironment();
   private final EnvironmentSelection environmentSelection = new EnvironmentSelection(this.instanceEnvironment);
   private boolean validationEnabled = true;
   private Set<ConfigurationException> globalErrors = Collections.emptySet();
   private Set<ConfigurationException> errorsOfSelectedPlugin = Collections.emptySet();
   private String docsText;

   public Optional<ConfigContainer> getConfigContainer() {
      return Optional.ofNullable(this.configContainer);
   }

   public void setConfigContainer(ConfigContainer configContainer) {
      this.configContainer = configContainer;
      this.selectedConfiguration = null;
      this.lastValidatedConfiguration = null;
   }

   public Optional<MutablePluginConfiguration> getSelectedConfiguration() {
      return Optional.ofNullable(this.selectedConfiguration);
   }

   public Optional<MutablePluginConfiguration> getLastValidatedConfiguration() {
      return Optional.ofNullable(this.lastValidatedConfiguration);
   }

   public Stream<PropertyConfigurationWithPluginConfiguration> getEnvironmentSpecificProperties() {
      return this.getConfigContainer()
         .stream()
         .map(ConfigContainer::getDictionary)
         .flatMap(d -> d.getEnvironmentSpecificProperties(this.environmentSelection.getSelectedEnvironment()));
   }

   public Set<MutablePluginConfiguration> getAllPluginConfigurations() {
      return this.getConfigContainer()
         .map(ConfigContainer::getDictionary)
         .map(PluginConfigurationDictionary::getAllPluginConfigurations)
         .orElseGet(Collections::emptySet);
   }

   @SuppressFBWarnings(justification = "generated code")
   public ConfigurationEnvironment getInstanceEnvironment() {
      return this.instanceEnvironment;
   }

   @SuppressFBWarnings(justification = "generated code")
   public EnvironmentSelection getEnvironmentSelection() {
      return this.environmentSelection;
   }

   @SuppressFBWarnings(justification = "generated code")
   public boolean isValidationEnabled() {
      return this.validationEnabled;
   }

   @SuppressFBWarnings(justification = "generated code")
   public Set<ConfigurationException> getGlobalErrors() {
      return this.globalErrors;
   }

   @SuppressFBWarnings(justification = "generated code")
   public Set<ConfigurationException> getErrorsOfSelectedPlugin() {
      return this.errorsOfSelectedPlugin;
   }

   @SuppressFBWarnings(justification = "generated code")
   public String getDocsText() {
      return this.docsText;
   }

   @SuppressFBWarnings(justification = "generated code")
   public void setSelectedConfiguration(MutablePluginConfiguration selectedConfiguration) {
      this.selectedConfiguration = selectedConfiguration;
   }

   @SuppressFBWarnings(justification = "generated code")
   public void setLastValidatedConfiguration(MutablePluginConfiguration lastValidatedConfiguration) {
      this.lastValidatedConfiguration = lastValidatedConfiguration;
   }

   @SuppressFBWarnings(justification = "generated code")
   public void setValidationEnabled(boolean validationEnabled) {
      this.validationEnabled = validationEnabled;
   }

   @SuppressFBWarnings(justification = "generated code")
   public void setGlobalErrors(Set<ConfigurationException> globalErrors) {
      this.globalErrors = globalErrors;
   }

   @SuppressFBWarnings(justification = "generated code")
   public void setErrorsOfSelectedPlugin(Set<ConfigurationException> errorsOfSelectedPlugin) {
      this.errorsOfSelectedPlugin = errorsOfSelectedPlugin;
   }

   @SuppressFBWarnings(justification = "generated code")
   public void setDocsText(String docsText) {
      this.docsText = docsText;
   }
}
