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

import static org.apache.commons.lang3.StringUtils.isAnyBlank;
import static org.apache.commons.lang3.StringUtils.isNotBlank;

import java.io.Serializable;
import java.util.Objects;

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

/**
 * Referenz auf eine Liste zur Verwendung in CustomData (unter der Annahme, dass in NL IMMER nur eine Liste pro Gruppe und Gebiet existiert)...
 *
 * @see ELECT-11274
 */
public class NlListeCustomDataReferenz implements Serializable {

  private static final long serialVersionUID = 1L;

  private static final NlListeCustomDataReferenz EMPTY = new NlListeCustomDataReferenz();

  private String gruppeSchluessel;

  private String gebietNummer;

  public NlListeCustomDataReferenz() {
    super();
  }

  public boolean isEmpty() {
    return Objects.equals(this, EMPTY) || isAnyBlank(getGruppeSchluessel(), getGebietNummer());
  }

  public String getGruppeSchluessel() {
    return gruppeSchluessel;
  }

  public void setGruppeSchluessel(String gruppeSchluessel) {
    this.gruppeSchluessel = gruppeSchluessel;
  }

  public String getGebietNummer() {
    return gebietNummer;
  }

  public void setGebietNummer(String gebietNummer) {
    this.gebietNummer = gebietNummer;
  }

  @Override
  public int hashCode() {
    return Objects.hash(gebietNummer, gruppeSchluessel);
  }

  @Override
  public boolean equals(Object obj) {
    if (this == obj) {
      return true;
    }

    if (obj == null) {
      return false;
    }

    if (getClass() != obj.getClass()) {
      return false;
    }

    NlListeCustomDataReferenz other = (NlListeCustomDataReferenz) obj;

    if (!Objects.equals(gebietNummer, other.gebietNummer)) {
      return false;
    }

    if (!Objects.equals(gruppeSchluessel, other.gruppeSchluessel)) {
      return false;
    }

    return true;
  }

  public static NlListeCustomDataReferenz of(Wahlvorschlag wahlvorschlag) {
    if (wahlvorschlag != null && wahlvorschlag.isListe()) {
      Gebiet gebiet = wahlvorschlag.getGebiet();
      Gruppe gruppe = wahlvorschlag.getGruppe();

      if (gebiet != null && isNotBlank(gebiet.getNummer()) && gruppe != null && isNotBlank(gruppe.getSchluessel())) {
        NlListeCustomDataReferenz nlListeCustomDataReferenz = new NlListeCustomDataReferenz();
        nlListeCustomDataReferenz.setGruppeSchluessel(gruppe.getSchluessel());
        nlListeCustomDataReferenz.setGebietNummer(gebiet.getNummer());

        return nlListeCustomDataReferenz;
      }
    }

    return EMPTY;
  }
}
