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

import static java.util.stream.Collectors.toList;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Collection;
import java.util.Comparator;
import java.util.Date;
import java.util.List;
import java.util.Optional;

import javax.annotation.Nullable;

public interface PersonenregisterVersion {

  default boolean isGueltig() {
    return isGueltigAm(new Date());
  }

  default boolean isGueltigAm(Date gueltigAm) {
    return gueltigAm != null && getGueltigAb().map(gueltigAb -> !gueltigAm.before(gueltigAb)).orElse(false);
  }

  Optional<Date> getGueltigAb();

  @Nullable
  static Date parseDate(String ddMMyyyy) {
    try {
      return new SimpleDateFormat("dd.MM.yyyy").parse(ddMMyyyy);
    } catch (ParseException ignored) {
    }

    return null;
  }

  static <V extends PersonenregisterVersion> V getValueGueltigOrDefault(Collection<V> values, V defaultValue) {
    List<V> valuesSortedByGueltigAbAsc = values.stream() //
        .filter(value -> value.getGueltigAb().isPresent() && value.isGueltig()) //
        .sorted(Comparator.comparing(value -> value.getGueltigAb().get())) //
        .collect(toList());

    if (valuesSortedByGueltigAbAsc.isEmpty()) {
      return defaultValue;
    }

    return valuesSortedByGueltigAbAsc.get(valuesSortedByGueltigAbAsc.size() - 1);
  }
}
