package com.airlock.iam.plugin.configeditor.ui.plugintrees;

import com.airlock.iam.configeditor.shared.domain.IamModuleConfigRoot;
import com.airlock.iam.elog.api.ELogger;
import com.airlock.iam.elog.api.ELoggerFactory;
import com.airlock.iam.plugin.api.config.ConfigurationContext;
import com.airlock.iam.plugin.configeditor.data.tree.PluginConfigurationTreeItem;
import com.airlock.iam.plugin.framework.application.configuration.MutablePluginConfiguration;
import com.airlock.iam.system.property.IamSystemProperties;
import com.google.common.annotations.VisibleForTesting;
import java.nio.file.Path;
import java.util.Comparator;
import java.util.Set;
import java.util.TreeSet;

public class UnconnectedPluginsTree extends CompositionTree {
   private static final ELogger LOG = ELoggerFactory.getLogger(UnconnectedPluginsTree.class);

   public UnconnectedPluginsTree(String displayName) {
      this(displayName, IamSystemProperties.getRootDirectory());
   }

   @VisibleForTesting
   UnconnectedPluginsTree(String displayName, Path rootDirectory) {
      super(displayName, new ValidationStatusHandler(), rootDirectory);
   }

   @Override
   protected void updateTreeImpl() {
      long time = System.currentTimeMillis();
      Set<MutablePluginConfiguration> unconnectedPlugins = this.getUnconnectedItemsSortedByCaption();

      for (MutablePluginConfiguration pc : unconnectedPlugins) {
         if (pc != null) {
            this.addPluginConfigurationItem(
               null,
               pc,
               this.getDisplayName(pc),
               this.getApplication().getSelectedConfigurationEnvironment(),
               ConfigurationContext.defaultContext(),
               this.collectGlobalValidationErrors(unconnectedPlugins)
            );
         }
      }

      LOG.debug("Updated UnconnectedPluginsTree with " + this.size() + " nodes in " + (System.currentTimeMillis() - time) + " ms.");
   }

   private String getDisplayName(MutablePluginConfiguration pc) {
      return PluginConfigurationTreeItem.renderDisplayName(pc, pc.getPluginDisplayName(), true);
   }

   private Set<MutablePluginConfiguration> getUnconnectedItemsSortedByCaption() {
      Set<MutablePluginConfiguration> unconnectedItems = new TreeSet<>(Comparator.comparing(this::getDisplayName));
      unconnectedItems.addAll(this.getPluginConfigDict().getUnconnectedItems(IamModuleConfigRoot.getRootPluginDisplayNames()));
      return unconnectedItems;
   }
}
