
package de.ivu.elect.business.person.control;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.function.Function;

import de.ivu.elect.business.person.entity.Geschlecht;
import de.ivu.elect.business.person.entity.Personendaten;
import de.ivu.elect.util.MapBuilder;

public class PersonendatenMapCreator {

  public PersonendatenMapCreator() {
    super();
  }

  public <T extends Personendaten> Map<String, List<T>> personenNachOrdnungsmerkmal(Collection< ? extends T> personendaten) {
    return map(personendaten, Personendaten::getOrdnungsmerkmal);
  }

  public <T extends Personendaten> Map<Date, List<T>> personenNachGeburtsdatum(Collection< ? extends T> personendaten) {
    return map(personendaten, Personendaten::getGeburtsdatum);
  }

  public <T extends Personendaten> Map<String, List<T>> personenNachFamilienname(Collection< ? extends T> personendaten) {
    return map(personendaten, Personendaten::getFamilienname);
  }

  public <T extends Personendaten> Map<String, List<T>> personenNachFamiliennameNormalisiert(Collection< ? extends T> personendaten) {
    return map(personendaten, Personendaten::getFamiliennameNormalisiert);
  }

  public <T extends Personendaten> Map<Geschlecht, List<T>> personenNachGeschlecht(Collection< ? extends T> personendaten) {
    Map<Geschlecht, List<T>> result = map(personendaten, Personendaten::getGeschlecht);

    // sicherstellen, dass für jedes Geschlecht ein Eintrag vorhanden ist
    for (Geschlecht geschlecht : Geschlecht.values()) {
      if (result.get(geschlecht) == null) {
        result.put(geschlecht, new ArrayList<T>());
      }
    }

    return result;
  }

  private <T extends Personendaten, R> Map<R, List<T>> map(Collection< ? extends T> personendaten, Function<T, R> function) {
    return MapBuilder.newMapMultipleEntriesFrom(personendaten, function);
  }
}
