
package de.ivu.elect.business.niederschrift.entity;

import static java.util.stream.Collectors.toList;
import static org.apache.commons.lang3.StringUtils.defaultIfBlank;
import static org.apache.commons.lang3.StringUtils.split;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import org.apache.commons.lang3.StringUtils;

import de.ivu.elect.business.konfiguration.entity.AbstractKonfigurationLoader;
import de.ivu.elect.business.konfiguration.entity.ElectKonfigurationWerte;
import de.ivu.elect.util.CaseAndDiacriticIgnoringComparator;

// ELECTMUC-2762
public class NiederschriftStatusAenderungRaeume {

  public static final String VALUES_RAUM_SEPARATOR = "|";

  public static final String VALUES_RAUM_ERGEBNISERFASSUNG_DEFAULT = "Ergebniserfassung";

  private final AbstractKonfigurationLoader konfigurationLoader;

  public NiederschriftStatusAenderungRaeume(AbstractKonfigurationLoader konfigurationLoader) {
    super();

    this.konfigurationLoader = konfigurationLoader;
  }

  public String getRaumErgebniserfassung() {
    return defaultIfBlank(getValueConfiguredErgebniserfassung(), VALUES_RAUM_ERGEBNISERFASSUNG_DEFAULT);
  }

  public List<String> getRaeume() {
    Set<String> values = new HashSet<>();
    values.add(getRaumErgebniserfassung());
    values.addAll(getValuesConfiguredWeitere());

    return values.stream() //
        .filter(StringUtils::isNotBlank) //
        .sorted(CaseAndDiacriticIgnoringComparator.DEFAULT_INSTANCE) //
        .collect(toList());
  }

  private String getValueConfiguredErgebniserfassung() {
    return konfigurationLoader.resolveStringValue(ElectKonfigurationWerte.NIEDERSCHRIFT_STATUS_AENDERUNG_VALUES_RAUM_ERGEBNISERFASSUNG);
  }

  private List<String> getValuesConfiguredWeitere() {
    List<String> result = new ArrayList<>();

    String[] values = split(konfigurationLoader.resolveStringValue(ElectKonfigurationWerte.NIEDERSCHRIFT_STATUS_AENDERUNG_VALUES_RAUM_WEITERE), VALUES_RAUM_SEPARATOR);

    if (values != null) {
      for (String value : values) {
        result.add(value);
      }
    }

    return result;
  }
}
