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

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

import de.ivu.elect.business.gebietsbaum.entity.Gebiet;

public class GebietByDepthFirstComparator implements Comparator<Gebiet>, Serializable {

  public static final GebietByDepthFirstComparator INSTANCE = new GebietByDepthFirstComparator();

  private static final long serialVersionUID = 1L;

  @Override
  public int compare(Gebiet o1, Gebiet o2) {
    if (o1.equals(o2)) {
      return 0;
    }
    if (o1.getUebergeordnetesGebiet() == null) {
      return -1;
    }

    if (o2.getUebergeordnetesGebiet() == null) {
      return 1;
    }

    if (o2.isUntergebietVon(o1)) {
      return -1;
    }
    if (o1.isUntergebietVon(o2)) {
      return 1;
    }

    return compareReihenfolgeBeiGemeinsamenObergebiet(o1, o2);

  }

  private int compareReihenfolgeBeiGemeinsamenObergebiet(Gebiet o1, Gebiet o2) {

    if (o1.getUebergeordnetesGebiet() == null || o2.getUebergeordnetesGebiet() == null) {
      return 0;
    }

    if (o1.getUebergeordnetesGebiet().equals(o2.getUebergeordnetesGebiet())) {
      int result = GebietByBreadthFirstComparator.comparePosition(o1, o2);
      if (result == 0) {
        return GebietByBreadthFirstComparator.compareNummer(o1, o2);
      }
      return result;
    }

    int result = compareReihenfolgeBeiGemeinsamenObergebiet(o1.getUebergeordnetesGebiet(), o2);
    if (result == 0) {
      return compareReihenfolgeBeiGemeinsamenObergebiet(o1, o2.getUebergeordnetesGebiet());
    }
    return result;
  }
}
