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

import com.airlock.iam.plugin.api.config.ConfigurationContext;
import com.airlock.iam.plugin.api.exception.ConfigurationException;
import com.airlock.iam.plugin.api.exception.PropertyConfigurationException;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.StandardOpenOption;
import java.util.Collection;

public final class ConfigUtil {
   private ConfigUtil() {
   }

   public static Path createTempFile(byte[] bytes, String filePrefix) {
      try {
         Path temp = Files.createTempFile(filePrefix, null);
         temp.toFile().deleteOnExit();
         Files.write(temp, bytes, StandardOpenOption.CREATE);
         return temp;
      } catch (IOException e) {
         throw new IllegalStateException(e);
      }
   }

   @SuppressFBWarnings("POTENTIAL_XML_INJECTION")
   public static String renderExceptionList(Collection<ConfigurationException> exceptions, boolean includePluginConfigurations) {
      StringBuilder sb = new StringBuilder(19);

      for (ConfigurationException ce : exceptions) {
         if (includePluginConfigurations) {
            sb.append("<b>");
            sb.append(ce.getPluginConfiguration().getPluginClassDisplayName());
            if (ce.getPluginConfiguration().getPluginDisplayName() != null) {
               sb.append(" (");
               sb.append(ce.getPluginConfiguration().getPluginDisplayName());
               sb.append(')');
            }

            if (!ConfigurationContext.defaultContext().equals(ce.getConfigurationContext())) {
               sb.append(", [Context: ");
               sb.append(ce.getConfigurationContext().toString());
               sb.append(']');
            }

            sb.append("</b><br/>");
         }

         if (ce instanceof PropertyConfigurationException pce) {
            sb.append("<i>");
            sb.append(pce.getPropertyNames());
            sb.append("</i>: ");
            sb.append(pce.getDescription());
         } else {
            sb.append(ce.getMessage());
         }

         sb.append("<br/><br/>");
      }

      return sb.toString();
   }

   public static String renderExceptionListAsSimpleMessage(Collection<ConfigurationException> exceptions, boolean isValidationIcon) {
      StringBuilder sb = new StringBuilder(53);
      int numberOfExceptions = exceptions.size();
      sb.append("There ");
      if (numberOfExceptions > 1) {
         sb.append("are ");
         sb.append(numberOfExceptions);
         sb.append(" errors.");
      } else {
         sb.append("is ");
         sb.append(numberOfExceptions);
         sb.append(" error.");
      }

      if (isValidationIcon) {
         sb.append(" Click on the icon for more information.");
      }

      return sb.toString();
   }
}
