package de.ivu.elect.business.statistik.entity;

import java.io.Serializable;

import javax.annotation.Nullable;

import org.apache.commons.lang3.StringUtils;

import de.ivu.elect.business.wahl.entity.Wahl;

/**
 *  on 31.01.2017.
 */
public class StatistikKennzeichenWahlQualifier implements Comparable<StatistikKennzeichenWahlQualifier>, Serializable {

  private final Wahl wahl;

  private final StatistikKennzeichenArt statistikKennzeichenArt;

  private final String qualifier;

  protected StatistikKennzeichenWahlQualifier(@Nullable Wahl wahl, StatistikKennzeichenArt statistikKennzeichenArt, @Nullable String qualifier) {
    this.wahl = wahl;
    this.statistikKennzeichenArt = statistikKennzeichenArt;
    this.qualifier = qualifier;
  }

  public StatistikKennzeichenWahlQualifier(StatistikKennzeichen statistikKennzeichen) {
    this(statistikKennzeichen.getWahl(), statistikKennzeichen.getKennzeichen(), statistikKennzeichen.getQualifier());
  }

  public Wahl getWahl() {
    return wahl;
  }

  public StatistikKennzeichenArt getStatistikKennzeichenArt() {
    return statistikKennzeichenArt;
  }

  public String getQualifier() {
    return qualifier;
  }

  @Override
  public boolean equals(Object o) {
    if (this == o) return true;
    if (o == null || getClass() != o.getClass()) return false;

    StatistikKennzeichenWahlQualifier that = (StatistikKennzeichenWahlQualifier) o;

    if (wahl != null ? !wahl.equals(that.wahl) : that.wahl != null) return false;
    if (statistikKennzeichenArt != that.statistikKennzeichenArt) return false;
    return !(qualifier != null ? !qualifier.equals(that.qualifier) : that.qualifier != null);

  }

  @Override
  public int hashCode() {
    int result = wahl != null ? wahl.hashCode() : 0;
    result = 31 * result + (statistikKennzeichenArt != null ? statistikKennzeichenArt.hashCode() : 0);
    result = 31 * result + (qualifier != null ? qualifier.hashCode() : 0);
    return result;
  }

  @Override
  public String toString() {
    return "StatistikKennzeichenWahlQualifier{" +
        "wahl=" + wahl +
        ", statistikKennzeichenArt=" + statistikKennzeichenArt +
        ", qualifier='" + qualifier + '\'' +
        '}';
  }

  @Override
  public int compareTo(StatistikKennzeichenWahlQualifier o) {
    int result = 0;

    if (result == 0) {
      result = this.statistikKennzeichenArt.compareTo(o.getStatistikKennzeichenArt());
    }

    if (result == 0) {
      result = compareQualifier(o);
    }

    if (result == 0) {
      result = compareWahlen(o);
    }
    return result;

  }

  private int compareWahlen(StatistikKennzeichenWahlQualifier o) {
    if (wahl == null) {
      if (o.getWahl() == null) {
        return 0;
      }
      return -1;
    }
    if (o.getWahl() == null) {
      return 1;
    }
    return wahl.getPosition().compareTo(o.getWahl().getPosition());
  }

  private int compareQualifier(StatistikKennzeichenWahlQualifier o) {
    if (StringUtils.isBlank(qualifier)) {
      if (StringUtils.isBlank(o.getQualifier())) {
        return 0;
      }
      return -1;
    }
    if (StringUtils.isBlank(o.getQualifier())) {
      return 1;
    }
    return qualifier.compareTo(o.getQualifier());

  }
}
