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

import java.util.Comparator;

import javax.annotation.Nullable;

import de.ivu.elect.business.gebietsbaum.entity.Gebiet;
import de.ivu.elect.business.kandidatur.entity.Listenkandidatur;
import de.ivu.elect.business.stimmzettel.entity.AbstractEntityAufStimmzettelStimmzettelPosition;
import de.ivu.elect.business.stimmzettel.entity.EntityAufStimmzettelDaten;
import de.ivu.elect.util.NullComparator;

public class ListenkandidaturByStimmzettelPositionComparator implements Comparator<Listenkandidatur> {

  private final Gebiet gebiet;

  private final EntityAufStimmzettelDaten entityAufStimmzettelDaten;

  public ListenkandidaturByStimmzettelPositionComparator(EntityAufStimmzettelDaten entityAufStimmzettelDaten) {
    this(Listenkandidatur.NULL_GEBIET, entityAufStimmzettelDaten);
  }

  public ListenkandidaturByStimmzettelPositionComparator(@Nullable Gebiet gebiet, EntityAufStimmzettelDaten entityAufStimmzettelDaten) {
    super();

    this.gebiet = gebiet;

    this.entityAufStimmzettelDaten = entityAufStimmzettelDaten;
  }

  @Override
  public int compare(Listenkandidatur one, Listenkandidatur another) {
    if (one == null || another == null) {
      return NullComparator.NULL_BEFORE_NON_NULL_COMPARATOR.compare(one, another);
    }

    return compareByPosition(getStimmzettelPosition(one), getStimmzettelPosition(another));
  }

  private int compareByPosition(Long one, Long another) {
    return AbstractEntityAufStimmzettelStimmzettelPosition.DEFAULT_POSITION_COMPARATOR.compare(one, another);
  }

  protected Gebiet getGebiet() {
    return gebiet;
  }

  protected Long getStimmzettelPosition(Listenkandidatur listenkandidatur) {
    return listenkandidatur.getStimmzettelPosition(getGebiet(), entityAufStimmzettelDaten).getPosition();
  }
}
