
package de.ivu.elect.util;

import static java.util.Arrays.asList;
import static org.apache.commons.lang3.StringUtils.isNotBlank;
import static org.apache.commons.lang3.StringUtils.join;
import static org.apache.commons.lang3.StringUtils.splitByWholeSeparator;
import static org.apache.commons.lang3.StringUtils.trimToEmpty;

import java.util.ArrayList;
import java.util.List;

public class StringListUtil {

  static final String ZEICHENKETTE_DIE_IN_KEINEM_WERT_VORKOMMT = "__##__";

  private StringListUtil() {
    super();
  }

  public static List<String> getStringListeByString(String wert, String trennzeichen) {
    if (wert == null) {
      return new ArrayList<>();
    }

    String wertMitErsetztenEscapeZeichen = ersetzeEscapteTrennzeichen(wert, trennzeichen);

    List<String> werteMitErsetztenEscapeZeichen = asList(splitByWholeSeparator(wertMitErsetztenEscapeZeichen, trennzeichen));

    List<String> result = new ArrayList<>();

    for (String value : werteMitErsetztenEscapeZeichen) {
      value = stelleEscapteTrennzeichenWiederHer(value, trennzeichen);
      value = entferneEscapeZeichen(value, trennzeichen);

      result.add(value);
    }

    return result;
  }

  public static String getStringByStringListe(List<String> werte, String trennzeichen) {
    if (werte == null || werte.isEmpty()) {
      return null;
    }

    List<String> werteNormalisiert = new ArrayList<>();

    for (String wert : werte) {
      if (isNotBlank(wert)) {
        werteNormalisiert.add(escapeTrennzeichen(trimToEmpty(wert), trennzeichen));
      }
    }

    return join(werteNormalisiert.toArray(), trennzeichen);
  }

  /*
   * Trennzeichen mit sich selbst escapen.
   */
  static String escapeTrennzeichen(String value, String trennzeichen) {
    return value.replace(trennzeichen, trennzeichen + trennzeichen);
  }

  static String entferneEscapeZeichen(String value, String trennzeichen) {
    return value.replace(trennzeichen + trennzeichen, trennzeichen);
  }

  static String ersetzeEscapteTrennzeichen(String value, String trennzeichen) {
    return value.replace(trennzeichen + trennzeichen, ZEICHENKETTE_DIE_IN_KEINEM_WERT_VORKOMMT);
  }

  static String stelleEscapteTrennzeichenWiederHer(String value, String trennzeichen) {
    return value.replace(ZEICHENKETTE_DIE_IN_KEINEM_WERT_VORKOMMT, trennzeichen + trennzeichen);
  }
}
