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

import static java.util.Arrays.asList;
import static java.util.Objects.nonNull;
import static org.apache.commons.lang3.StringUtils.isNotBlank;

import java.util.List;

public abstract class AbstractStaatenGruppe implements StaatenGruppeBase {

  private static final long serialVersionUID = 1L;

  public static final String DEFAULT_EXCHANGE_FORMAT = "file.format.staatengruppe.export.default";

  public AbstractStaatenGruppe() {
    super();
  }

  public boolean hasBezeichnung() {
    return isNotBlank(getBezeichnung());
  }

  public boolean containsStaatsangehoerigkeit(Staat staat) {
    return containsAnyStaatsangehoerigkeit(asList(staat));
  }

  public boolean containsAnyStaatsangehoerigkeit(List<Staat> staaten) {
    return staaten.stream()
        .anyMatch(staat -> nonNull(staat) && containsCodeStaatsangehoerigkeit(staat.getCustomCodeStaatsangehoerigkeit()));
  }

  public boolean containsCodeStaatsangehoerigkeit(String codeStaatsangehoerigkeit) {
    return isNotBlank(codeStaatsangehoerigkeit) && containsAnyCodeStaatsangehoerigkeit(asList(codeStaatsangehoerigkeit));
  }

  public boolean containsAnyCodeStaatsangehoerigkeit(List<String> codesStaatsangehoerigkeit) {
    return getStaats().stream().anyMatch(staat -> usesAnyCustomCodeStaatsangehoerigkeit(staat, codesStaatsangehoerigkeit));
  }

  private boolean usesAnyCustomCodeStaatsangehoerigkeit(Staat staat, List<String> codesStaatsangehoerigkeit) {
    return staat.hasCustomCodeStaatsangehoerigkeit() && (codesStaatsangehoerigkeit.contains(staat.getCustomCodeStaatsangehoerigkeit())
        || matchesCustomCodeStaatsangehoerigkeitInland(staat, codesStaatsangehoerigkeit));
  }

  private boolean matchesCustomCodeStaatsangehoerigkeitInland(Staat staat, List<String> codesStaatsangehoerigkeit) {
    if (AbstractStaat.matchesInland(staat.getCustomCodeStaatsangehoerigkeit())) {
      for (String codeStaatsangehoerigkeit : codesStaatsangehoerigkeit) {
        if (AbstractStaat.matchesInland(codeStaatsangehoerigkeit)) {
          return true;
        }
      }
    }

    return false;
  }

  public boolean hasStaaten() {
    return !getStaats().isEmpty();
  }
}
