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

import com.airlock.iam.plugin.api.config.ConfigurationEnvironment;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import java.util.HashSet;
import java.util.Set;
import java.util.TreeSet;

public final class EnvironmentSelection {
   private final Set<EnvironmentSelectionChangeListener> listeners = new HashSet<>();
   private final ConfigurationEnvironment instanceEnvironment;
   private ConfigurationEnvironment selectedEnvironment;
   private final Set<ConfigurationEnvironment> nonCommonEnvironmentsFromConfig = new TreeSet<>();

   public EnvironmentSelection(ConfigurationEnvironment instanceEnvironment) {
      this.instanceEnvironment = instanceEnvironment;
      this.selectedEnvironment = ConfigurationEnvironment.common();
   }

   public boolean isEnabled() {
      return !this.instanceEnvironment.isCommonEnvironment() || !this.nonCommonEnvironmentsFromConfig.isEmpty();
   }

   public void init(Set<ConfigurationEnvironment> environmentsFromConfig) {
      this.selectedEnvironment = ConfigurationEnvironment.common();
      this.nonCommonEnvironmentsFromConfig.clear();
      environmentsFromConfig.stream().filter(env -> !env.isCommonEnvironment()).forEach(this.nonCommonEnvironmentsFromConfig::add);
      this.notifyListeners();
   }

   public Set<ConfigurationEnvironment> getInitialEnvironments() {
      Set<ConfigurationEnvironment> environments = new TreeSet<>(this.nonCommonEnvironmentsFromConfig);
      environments.add(this.instanceEnvironment);
      environments.add(ConfigurationEnvironment.common());
      return environments;
   }

   public void setSelectedEnvironment(ConfigurationEnvironment to) {
      if (!this.selectedEnvironment.equals(to)) {
         this.selectedEnvironment = to;
         this.notifyListeners();
      }
   }

   private void notifyListeners() {
      for (EnvironmentSelectionChangeListener listener : this.listeners) {
         listener.environmentSelectionChanged(this);
      }
   }

   public void addListener(EnvironmentSelectionChangeListener listener) {
      this.listeners.add(listener);
   }

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