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

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

import de.ivu.elect.business.kandidatur.control.ListenkandidaturByEingereichtePositionComparator;
import de.ivu.elect.business.kandidatur.control.ListenkandidaturByRelativePositionComparator;
import de.ivu.elect.business.kandidatur.entity.Listenkandidatur;
import de.ivu.elect.business.wahlrechtspruefung.entity.Wahlrechtspruefung;
import de.ivu.elect.business.wahlvorschlag.control.WahlvorschlagByRelativePositionAndGruppeSchluesselComparator;
import de.ivu.elect.business.wahlvorschlag.entity.Wahlvorschlag;

public class WahlrechtspruefungByWahlvorschlagOderKandidaturRelativePositionAndPositionComparator implements Comparator<Wahlrechtspruefung>, Serializable {

  private static final long serialVersionUID = 1L;

  private static final Comparator<Wahlvorschlag> WAHLVORSCHLAG_BY_RELATIVE_POSITION_AND_GRUPPE_SCHLUESSEL_COMPARATOR = new WahlvorschlagByRelativePositionAndGruppeSchluesselComparator();

  private static final Comparator<Listenkandidatur> LISTENKANDIDATUR_BY_RELATIVE_POSITION_COMPARATOR = new ListenkandidaturByRelativePositionComparator();

  private static final Comparator<Listenkandidatur> LISTENKANDIDATUR_BY_EINGEREICHTE_POSITION_COMPARATOR = new ListenkandidaturByEingereichtePositionComparator();

  public WahlrechtspruefungByWahlvorschlagOderKandidaturRelativePositionAndPositionComparator() {
    super();
  }

  @Override
  public int compare(Wahlrechtspruefung o1, Wahlrechtspruefung o2) {
    int result = 0;

    if (result == 0 && !o1.getWahlvorschlag().equals(o2.getWahlvorschlag())) {
      result = WAHLVORSCHLAG_BY_RELATIVE_POSITION_AND_GRUPPE_SCHLUESSEL_COMPARATOR.compare(o1.getWahlvorschlag(), o2.getWahlvorschlag());
    }

    if (o1.getKandidatur() == null && o2.getKandidatur() != null) {
      return -1;
    }

    if (o1.getKandidatur() != null && o2.getKandidatur() == null) {
      return 1;
    }

    if (result == 0 && o1.getKandidatur() != null && o2.getKandidatur() != null && !o1.getKandidatur().equals(o2.getKandidatur()) && o1.getKandidatur().isInstanceOf(Listenkandidatur.class)
        && o2.getKandidatur().isInstanceOf(Listenkandidatur.class)) {
      Listenkandidatur listenkandidatur1 = o1.getKandidatur().castTo(Listenkandidatur.class).getEntity();
      Listenkandidatur listenkandidatur2 = o2.getKandidatur().castTo(Listenkandidatur.class).getEntity();

      result = LISTENKANDIDATUR_BY_EINGEREICHTE_POSITION_COMPARATOR.compare(listenkandidatur1, listenkandidatur2);

      if (result == 0) {
        result = LISTENKANDIDATUR_BY_RELATIVE_POSITION_COMPARATOR.compare(listenkandidatur1, listenkandidatur2);
      }
    }

    if (result == 0) {
      result = o1.getPruefkriterium().getPosition().compareTo(o2.getPruefkriterium().getPosition());
    }

    return result;
  }
}
