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

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

import org.apache.commons.lang3.ObjectUtils;

import de.ivu.elect.business.ergebnis.entity.Sitze;
import de.ivu.elect.business.gruppeimgebiet.entity.GruppeImGebiet;
import de.ivu.elect.business.gruppeimgebiet.entity.GruppeImGebietTK;

public class SitzeByGruppeImGebietRelativePositionAbgeleitetComparator implements Comparator<Sitze>, Serializable {

  private static final long serialVersionUID = 1L;

  private final Map<GruppeImGebietTK, GruppeImGebiet> gruppenImGebiet;

  public SitzeByGruppeImGebietRelativePositionAbgeleitetComparator(Map<GruppeImGebietTK, GruppeImGebiet> gruppenImGebiet) {
    this.gruppenImGebiet = gruppenImGebiet;
  }

  @Override
  public int compare(Sitze o1, Sitze o2) {
    // null > notNull
    if (o1 == null) {
      if (o2 == null) {
        return 0;
      }
      return 1;
    }
    if (o2 == null) {
      return -1;
    }

    GruppeImGebiet gig1 = o1.getGruppeImGebiet(gruppenImGebiet);
    GruppeImGebiet gig2 = o2.getGruppeImGebiet(gruppenImGebiet);
    // null > notNull
    if (gig1 == null) {
      if (gig2 == null) {
        return compareOhneRelativePositionAbgeleitet(o1, o2);
      }
      return 1;
    }
    if (gig2 == null) {
      return -1;
    }

    Long pos1 = gig1.getRelativePositionAbgeleitet();
    Long pos2 = gig2.getRelativePositionAbgeleitet();
    // null > notNull
    if (pos1 == null) {
      if (pos2 == null) {
        return compareOhneRelativePositionAbgeleitet(o1, o2);
      }
      return 1;
    }
    if (pos2 == null) {
      return -1;
    }

    int result = pos1.compareTo(pos2);
    if (result == 0) {
      result = compareOhneRelativePositionAbgeleitet(o1, o2);
    }
    return result;
  }

  private int compareOhneRelativePositionAbgeleitet(Sitze o1, Sitze o2) {
    int result = -ObjectUtils.compare(o1.getAnzahlAnspruch(), o2.getAnzahlAnspruch());
    if (result == 0) {
      result = ObjectUtils.compare(o1.getAnzahl(), o2.getAnzahl());
    }
    if (result == 0) {
      result = ObjectUtils.compare(o1.getGruppe().getKurzname(), o2.getGruppe().getKurzname());
    }
    return result;
  }

}
