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

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

import javax.annotation.Nullable;

import de.ivu.elect.business.gebietsbaum.entity.Gebiet;
import de.ivu.elect.business.stimmzettel.entity.AbstractEntityAufStimmzettelStimmzettelPosition;
import de.ivu.elect.business.stimmzettel.entity.EntityAufStimmzettelDaten;
import de.ivu.elect.business.wahlvorschlag.entity.Wahlvorschlag;
import de.ivu.elect.util.NullComparator;

public class WahlvorschlagByStimmzettelPositionComparator implements Comparator<Wahlvorschlag>, Serializable {

  private static final long serialVersionUID = 1L;

  private final Gebiet gebiet;

  private final EntityAufStimmzettelDaten entityAufStimmzettelDaten;

  public WahlvorschlagByStimmzettelPositionComparator(EntityAufStimmzettelDaten entityAufStimmzettelDaten) {
    this(Wahlvorschlag.NULL_GEBIET, entityAufStimmzettelDaten);
  }

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

    this.gebiet = gebiet == null ? Wahlvorschlag.NULL_GEBIET : gebiet;

    this.entityAufStimmzettelDaten = entityAufStimmzettelDaten;
  }

  @Override
  public int compare(Wahlvorschlag one, Wahlvorschlag 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(Wahlvorschlag wahlvorschlag) {
    return wahlvorschlag.getStimmzettelPosition(getGebiet(), entityAufStimmzettelDaten).getPosition();
  }
}
