package com.airlock.iam.plugin.config.manipulator;

import com.airlock.iam.base.misc.log.LogUtil;
import java.util.Set;
import java.util.function.Function;
import java.util.stream.Collectors;

public class DuplicatesDuringSnippetImportException extends SnippetImportException {
   public static final Function<Set<String>, String> DEFAULT_FORMATTER = d -> ": "
      + d.stream().sorted().<CharSequence>map(LogUtil::logSafeQuote).collect(Collectors.joining(", "))
      + ". ";
   public static final Function<Set<String>, String> MULTILINE_FORMATTER = d -> ":\n\n" + d.stream().sorted().collect(Collectors.joining("\n")) + "\n\n";
   private final String baseErrorMessage;
   private final Set<String> duplicates;

   public DuplicatesDuringSnippetImportException(String baseErrorMessage, Set<String> duplicates, String advice) {
      super(format(baseErrorMessage, duplicates, DEFAULT_FORMATTER, advice));
      this.baseErrorMessage = baseErrorMessage;
      this.duplicates = duplicates;
   }

   public String format(Function<Set<String>, String> duplicatesFormatter, String advice) {
      return format(this.baseErrorMessage, this.duplicates, duplicatesFormatter, advice);
   }

   private static String format(String baseErrorMessage, Set<String> duplicates, Function<Set<String>, String> duplicatesFormatter, String advice) {
      return baseErrorMessage + duplicatesFormatter.apply(duplicates) + advice;
   }
}
