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

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

import de.ivu.elect.business.gebietsbaum.control.GebietByGebietsartAndPositionComparator;
import de.ivu.elect.business.gebietsbaum.entity.Gebiet;
import de.ivu.elect.business.gruppe.control.GruppeByKurznameComparator;
import de.ivu.elect.business.gruppe.entity.Gruppe;
import de.ivu.elect.business.kandidatur.entity.Kandidatur;
import de.ivu.elect.business.kandidatur.entity.Listenkandidatur;
import de.ivu.elect.business.person.control.EntityMitPersonendatenByNamenComparator;
import de.ivu.elect.business.stimmzettel.entity.EntityAufStimmzettelDaten;
import de.ivu.elect.business.wahlvorschlag.control.WahlvorschlagByStimmzettelPositionComparator;

public class KandidaturByGebietStimmzettelPositionNameComparator implements Comparator<Kandidatur>, Serializable {

  private static final long serialVersionUID = 1L;

  private static final Comparator<Gebiet> GEBIET_BY_POSITION_COMPARATOR = new GebietByGebietsartAndPositionComparator();

  private static final Comparator<Gruppe> GRUPPE_BY_KURZNAME_COMPARATOR = GruppeByKurznameComparator.ASCENDING;

  private static final Comparator<Kandidatur> PERSONENDATEN_BY_NAMEN_COMPARATOR = new EntityMitPersonendatenByNamenComparator<>();

  private final WahlvorschlagByStimmzettelPositionComparator wahlvorschlagByStimmzettelPositionComparator;

  private final ListenkandidaturByStimmzettelPositionComparator listenkandidaturByStimmzettelPositionComparator;

  public KandidaturByGebietStimmzettelPositionNameComparator(Gebiet gebiet, EntityAufStimmzettelDaten entityAufStimmzettelDaten) {
    super();

    this.wahlvorschlagByStimmzettelPositionComparator = new WahlvorschlagByStimmzettelPositionComparator(gebiet, entityAufStimmzettelDaten);
    this.listenkandidaturByStimmzettelPositionComparator = new ListenkandidaturByStimmzettelPositionComparator(entityAufStimmzettelDaten);
  }

  @Override
  public int compare(Kandidatur one, Kandidatur another) {
    int result = GEBIET_BY_POSITION_COMPARATOR.compare(one.getWahlvorschlag().getGebiet(), another.getWahlvorschlag().getGebiet());

    if (result == 0) {
      result = wahlvorschlagByStimmzettelPositionComparator.compare(one.getWahlvorschlag(), another.getWahlvorschlag());
    }

    if (result == 0) {
      result = GRUPPE_BY_KURZNAME_COMPARATOR.compare(one.getGruppe(), another.getGruppe());
    }

    if (result == 0 && one.isListenkandidatur() && !another.isListenkandidatur()) {
      result = -1; // ELECT-11712
    }

    if (result == 0 && !one.isListenkandidatur() && another.isListenkandidatur()) {
      result = 1; // ELECT-11712
    }

    if (result == 0 && one.isListenkandidatur() && another.isListenkandidatur()) {
      result = vergleicheListenkandidaturen(one.castTo(Listenkandidatur.class).getEntity(), another.castTo(Listenkandidatur.class).getEntity());
    }

    if (result == 0) {
      result = PERSONENDATEN_BY_NAMEN_COMPARATOR.compare(one, another);
    }

    return result;

  }

  private int vergleicheListenkandidaturen(Listenkandidatur one, Listenkandidatur another) {
    return listenkandidaturByStimmzettelPositionComparator.compare(one, another);
  }
}
