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

import com.airlock.iam.plugin.api.exception.ConfigurationException;
import com.airlock.iam.plugin.configeditor.ui.ConfigUtil;
import com.airlock.iam.plugin.framework.application.configuration.MutablePluginConfiguration;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import java.util.HashSet;
import java.util.Set;
import org.apache.commons.lang3.StringUtils;

public class PluginConfigurationTreeItem implements TreeItem<MutablePluginConfiguration> {
   private final MutablePluginConfiguration pluginConfiguration;
   private final String caption;
   private Set<ConfigurationException> errors;
   private final boolean showDisplayName;

   public PluginConfigurationTreeItem(MutablePluginConfiguration pc, String caption, boolean showDisplayName) {
      this.pluginConfiguration = pc;
      this.caption = caption;
      this.showDisplayName = showDisplayName;
      this.errors = new HashSet<>();
   }

   @Override
   public String toString() {
      return renderDisplayName(this.pluginConfiguration, this.caption, this.showDisplayName);
   }

   public static String renderDisplayName(MutablePluginConfiguration pc, String caption, boolean showDisplayName) {
      StringBuilder sb = new StringBuilder(18);
      if (showDisplayName) {
         sb.append(pc.getPluginClassDisplayName());
      }

      if (showDisplayName && StringUtils.isNotEmpty(caption)) {
         sb.append(" - ");
      }

      sb.append(caption != null ? caption : "");
      if (sb.isEmpty()) {
         sb.append("[No caption]");
      }

      return sb.toString();
   }

   public void setErrors(Set<ConfigurationException> exceptions) {
      this.errors = exceptions;
   }

   @SuppressFBWarnings("POTENTIAL_XML_INJECTION")
   public String getTooltip() {
      if (this.pluginConfiguration == null) {
         return null;
      }

      StringBuilder sb = new StringBuilder(50);
      sb.append(this.pluginConfiguration.getPluginClassDisplayName());
      if (this.pluginConfiguration.getComment() != null) {
         sb.append("<h3>Comment:</h3>");
         sb.append(this.pluginConfiguration.getComment());
      }

      if (!this.errors.isEmpty()) {
         sb.append("<h3>Validation Errors:</h3>");
         sb.append(ConfigUtil.renderExceptionList(this.errors, true));
      }

      return sb.toString();
   }

   public boolean hasErrors() {
      return !this.errors.isEmpty();
   }

   public MutablePluginConfiguration getTreeItemIdentifier() {
      return this.pluginConfiguration;
   }

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

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

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

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