
package de.ivu.elect.presentation.stimmeingabe;

import java.util.Comparator;

import de.ivu.elect.business.stimmeingabe.control.StimmeingabefehlerComparator;
import de.ivu.elect.business.stimmeingabe.entity.StimmeingabePlausiKonfiguration;
import de.ivu.elect.business.stimmeingabe.entity.Stimmeingabefehlerart;
import de.ivu.elect.util.NullComparator;

public class StimmeingabePlausiKonfigurationComparator implements Comparator<StimmeingabePlausiKonfiguration> {

  private static final Comparator<Object> NULL_COMPARATOR = NullComparator.NULL_BEFORE_NON_NULL_COMPARATOR;

  public StimmeingabePlausiKonfigurationComparator() {
    super();
  }

  @Override
  public int compare(StimmeingabePlausiKonfiguration one, StimmeingabePlausiKonfiguration another) {
    if (one == null || another == null) {
      return NULL_COMPARATOR.compare(one, another);
    }

    int comparedByHavingCustomFehlerschluessel = compareByHavingCustomFehlerschluessel(one, another);

    if (comparedByHavingCustomFehlerschluessel == 0) {
      int comparedByFehlerart = compareByFehlerart(one, another);

      if (comparedByFehlerart == 0) {
        int comparedByFehlerschluessel = compareByFehlerschluessel(one, another);

        if (comparedByFehlerschluessel == 0) {
          return one.getTyp().name().compareTo(another.getTyp().name());
        }

        return comparedByFehlerschluessel;
      }

      return comparedByFehlerart;
    }

    return comparedByHavingCustomFehlerschluessel;
  }

  private int compareByHavingCustomFehlerschluessel(StimmeingabePlausiKonfiguration one, StimmeingabePlausiKonfiguration another) {
    return StimmeingabefehlerComparator.compareByHavingCustomFehlerschluessel(one.getFehlerschluessel(), another.getFehlerschluessel());
  }

  private int compareByFehlerschluessel(StimmeingabePlausiKonfiguration one, StimmeingabePlausiKonfiguration another) {
    return StimmeingabefehlerComparator.compareByFehlerschluessel(one.getFehlerschluessel(), another.getFehlerschluessel());
  }

  private int compareByFehlerart(StimmeingabePlausiKonfiguration one, StimmeingabePlausiKonfiguration another) {
    return compareByStimmeingabefehlerart(Stimmeingabefehlerart.of(one.getFehlerart()), Stimmeingabefehlerart.of(another.getFehlerart()));
  }

  private int compareByStimmeingabefehlerart(Stimmeingabefehlerart one, Stimmeingabefehlerart another) {
    if (one == null || another == null) {
      return NULL_COMPARATOR.compare(one, another);
    }

    return StimmeingabefehlerComparator.compareByStimmeingabefehlerart(one, another);
  }
}
