
package de.ivu.elect.presentation.ergebnis.dokumente.gesamtergebnis;

import java.io.Serializable;
import java.util.Collections;
import java.util.Comparator;

import de.ivu.elect.dokumente.wahlvorschlag.CoreWahlvorschlagsdatenDocument;
import de.ivu.elect.util.NullComparator;

public class KandidaturDocumentByPositionComparator implements Comparator<KandidaturMitStimmergebnissenDocument>, Serializable {

  private static final long serialVersionUID = 1L;

  public static final Comparator<KandidaturMitStimmergebnissenDocument> ASCENDING = new KandidaturDocumentByPositionComparator();

  public static final Comparator<KandidaturMitStimmergebnissenDocument> DESCENDING = Collections.reverseOrder(ASCENDING);

  private static final Comparator<Object> NULL_COMPARATOR = NullComparator.NON_NULL_BEFORE_NULL_COMPARATOR;

  private KandidaturDocumentByPositionComparator() {
    super();
  }

  @Override
  public int compare(KandidaturMitStimmergebnissenDocument one, KandidaturMitStimmergebnissenDocument another) {
    if (one != null && another != null) {
      int comparedByWahlvorschlag = compareByWahlvorschlag(one.wahlvorschlag, another.wahlvorschlag);

      if (comparedByWahlvorschlag == 0) {
        return compareAsc(one.listenkandidaturPositionStimmzettel, another.listenkandidaturPositionStimmzettel);
      }

      return comparedByWahlvorschlag;
    }

    return NULL_COMPARATOR.compare(one, another);
  }

  private int compareByWahlvorschlag(CoreWahlvorschlagsdatenDocument one, CoreWahlvorschlagsdatenDocument another) {
    return WahlvorschlagDocumentByPositionComparator.ASCENDING.compare(one, another);
  }

  private int compareAsc(Long one, Long another) {
    if (one != null && another != null) {
      return one.compareTo(another);
    }

    return NULL_COMPARATOR.compare(one, another);
  }
}
