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

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

import de.ivu.elect.business.gruppe.control.GruppeBySchluesselComparator;
import de.ivu.elect.business.gruppe.entity.Gruppe;
import de.ivu.elect.business.gruppeimgebiet.control.GruppeImGebietByRelativePositionComparator;
import de.ivu.elect.business.gruppeimgebiet.entity.GruppeImGebiet;
import de.ivu.elect.business.wahlvorschlag.entity.Wahlvorschlag;

public class WahlvorschlagByRelativePositionAndGruppeSchluesselComparator implements Comparator<Wahlvorschlag>, Serializable {

  private static final long serialVersionUID = 1L;

  private static final Comparator<Gruppe> GRUPPE_COMPARATOR = GruppeBySchluesselComparator.ASCENDING;

  private static final Comparator<GruppeImGebiet> GRUPPE_IM_GEBIET_COMPARATOR = new GruppeImGebietByRelativePositionComparator();

  public WahlvorschlagByRelativePositionAndGruppeSchluesselComparator() {
    super();
  }

  @Override
  public int compare(Wahlvorschlag one, Wahlvorschlag another) {
    if (one != null && another != null) {
      return compare(one.getGruppeImGebiet(), another.getGruppeImGebiet());
    }

    if (one == null) {
      if (another == null) {
        return 0;
      }

      return -1;
    }

    return 1;
  }

  private int compare(GruppeImGebiet one, GruppeImGebiet another) {
    int comparedByGruppeImGebiet = GRUPPE_IM_GEBIET_COMPARATOR.compare(one, another);

    if (comparedByGruppeImGebiet == 0) {
      return compare(one.getGruppe(), another.getGruppe());
    }

    return comparedByGruppeImGebiet;
  }

  private int compare(Gruppe one, Gruppe another) {
    return GRUPPE_COMPARATOR.compare(one, another);
  }
}
