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

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

import de.ivu.elect.business.gebietsbaum.entity.Gebiet;
import de.ivu.elect.business.gebietsbaum.entity.Wahldurchfuehrungsgebiet;
import de.ivu.elect.business.stimmeingabe.entity.StimmeingabeAuffaelligkeit;

public class AuffaelligkeitByAbweichungssummeComparator implements Comparator<StimmeingabeAuffaelligkeit>, Serializable {

  private static final long serialVersionUID = 1L;

  private final Wahldurchfuehrungsgebiet selectedWahldurchfuehrungsgebiet;

  public AuffaelligkeitByAbweichungssummeComparator(Wahldurchfuehrungsgebiet selectedWahldurchfuehrungsgebiet) {
    this.selectedWahldurchfuehrungsgebiet = selectedWahldurchfuehrungsgebiet;
  }

  @Override
  public int compare(StimmeingabeAuffaelligkeit o1, StimmeingabeAuffaelligkeit o2) {
    if (o1 == null && o2 == null) {
      return 0;
    }
    if (o2 == null) {
      return -1;
    }
    if (o1 == null) {
      return 1;
    }
    if (o1.getGebiet() != null && o1.getGebiet().equals(selectedWahldurchfuehrungsgebiet)) {
      return -1;
    }
    if (o2.getGebiet() != null && o2.getGebiet().equals(selectedWahldurchfuehrungsgebiet)) {
      return 1;
    }
    double difference = o1.getMaximaleAbweichungssummeVonEinemStimmenart() - o2.getMaximaleAbweichungssummeVonEinemStimmenart();
    if (difference > 0) {
      return -1;
    } else if (difference < 0) {
      return 1;
    }
    return compareGebiete(o1.getGebiet(), o2.getGebiet());
  }

  private int compareGebiete(Gebiet o1, Gebiet o2) {
    int result = o1.getPosition().compareTo(o2.getPosition());

    if (result == 0) {
      result = o1.getPk().compareTo(o2.getPk());

    }
    return result;
  }

}