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

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

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

import de.ivu.elect.business.gruppe.entity.Gruppe;
import de.ivu.elect.business.wahlvorschlag.control.WahlvorschlagByZeitpunktDerEinreichungComparator;
import de.ivu.elect.business.wahlvorschlag.entity.Wahlvorschlag;

public class GruppeByWahlvorschlagErsterZeitpunktDerEinreichungComparator implements Comparator<Gruppe>, Serializable {

  private static final long serialVersionUID = 1L;

  private static final Comparator<Wahlvorschlag> WAHLVORSCHLAG_COMPARATOR = WahlvorschlagByZeitpunktDerEinreichungComparator.ASCENDING;

  private final Map<Gruppe, Wahlvorschlag> wahlvorschlagErsterZeitpunktDerEinreichungPerGruppe;

  public GruppeByWahlvorschlagErsterZeitpunktDerEinreichungComparator(Collection< ? extends Wahlvorschlag> wahlvorschlaegeInWahl) {
    this(new HashMap<>(wahlvorschlaegeInWahl.stream().collect(groupingBy(Wahlvorschlag::getGruppe))));
  }

  public GruppeByWahlvorschlagErsterZeitpunktDerEinreichungComparator(Map<Gruppe, Collection<Wahlvorschlag>> wahlvorschlaegePerGruppe) {
    super();

    this.wahlvorschlagErsterZeitpunktDerEinreichungPerGruppe = new HashMap<>();

    for (Entry<Gruppe, Collection<Wahlvorschlag>> entry : wahlvorschlaegePerGruppe.entrySet()) {
      List<Wahlvorschlag> wahlvorschlaegeInGruppe = new ArrayList<>(entry.getValue());
      wahlvorschlaegeInGruppe.sort(WAHLVORSCHLAG_COMPARATOR);

      if (!wahlvorschlaegeInGruppe.isEmpty()) {
        this.wahlvorschlagErsterZeitpunktDerEinreichungPerGruppe.put(entry.getKey(), wahlvorschlaegeInGruppe.get(0));
      }
    }
  }

  @Override
  public int compare(Gruppe one, Gruppe another) {
    return WAHLVORSCHLAG_COMPARATOR.compare(wahlvorschlagErsterZeitpunktDerEinreichungPerGruppe.get(one), wahlvorschlagErsterZeitpunktDerEinreichungPerGruppe.get(another));
  }
}
