
package de.ivu.elect.presentation.stimmeingabe.status;

import java.util.Comparator;

import de.ivu.elect.business.stimmeingabe.entity.Ergebniseingabestufe;
import de.ivu.elect.jee.faces.Messages;
import de.ivu.elect.jee.presentation.status.OutputSeverity;

public class GebietErfassungsstatusInErgebniseingabestufe implements Comparable<GebietErfassungsstatusInErgebniseingabestufe> {

  public static final Comparator<GebietErfassungsstatusInErgebniseingabestufe> DEFAULT_COMPARATOR = GebietErfassungsstatusInErgebniseingabestufe::compareTo;

  private final Ergebniseingabestufe ergebniseingabestufe;

  private final GebietErfassungsstatus gebietErfassungsstatus;

  public GebietErfassungsstatusInErgebniseingabestufe(Ergebniseingabestufe ergebniseingabestufe, GebietErfassungsstatus gebietErfassungsstatus) {
    super();

    this.ergebniseingabestufe = ergebniseingabestufe;

    this.gebietErfassungsstatus = gebietErfassungsstatus;
  }

  public Ergebniseingabestufe getErgebniseingabestufe() {
    return ergebniseingabestufe;
  }

  public GebietErfassungsstatus getGebietErfassungsstatus() {
    return gebietErfassungsstatus;
  }

  public OutputSeverity getSeverity() {
    return getGebietErfassungsstatus().getSeverity();
  }

  public String getMessage(Messages messages, String msgKeyPrefix, Object... params) {
    return messages.getMessageForMessageKey(getMessageKey(msgKeyPrefix), params);
  }

  protected String getMessageKey(String msgKeyPrefix) {
    return msgKeyPrefix + "." + getGebietErfassungsstatus().name() + "." + getErgebniseingabestufe().name();
  }

  @Override
  public int compareTo(GebietErfassungsstatusInErgebniseingabestufe another) {
    int comparedByErgebniseingabestufe = Ergebniseingabestufe.REIHENFOLGE_ASC.compare(getErgebniseingabestufe(), another.getErgebniseingabestufe());

    if (comparedByErgebniseingabestufe == 0) {
      return GebietErfassungsstatus.DEFAULT_COMPARATOR.compare(getGebietErfassungsstatus(), another.getGebietErfassungsstatus());
    }

    return comparedByErgebniseingabestufe;
  }

  @Override
  public int hashCode() {
    final int prime = 31;
    int result = 1;
    result = prime * result + (ergebniseingabestufe == null ? 0 : ergebniseingabestufe.hashCode());
    result = prime * result + (gebietErfassungsstatus == null ? 0 : gebietErfassungsstatus.hashCode());
    return result;
  }

  @Override
  public boolean equals(Object obj) {
    if (this == obj) {
      return true;
    }
    if (obj == null) {
      return false;
    }
    if (getClass() != obj.getClass()) {
      return false;
    }
    GebietErfassungsstatusInErgebniseingabestufe other = (GebietErfassungsstatusInErgebniseingabestufe) obj;
    if (ergebniseingabestufe != other.ergebniseingabestufe) {
      return false;
    }
    if (gebietErfassungsstatus != other.gebietErfassungsstatus) {
      return false;
    }
    return true;
  }

  @Override
  public String toString() {
    return "GebietErfassungsstatusInErgebniseingabestufe{" +
        "ergebniseingabestufe=" + ergebniseingabestufe +
        ", gebietErfassungsstatus=" + gebietErfassungsstatus +
        ", severity=" + getSeverity() +
        '}';
  }
}
