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

import java.util.Collection;
import java.util.Date;

import de.ivu.elect.business.gebietsbaum.entity.Wahldurchfuehrungsgebiet;
import de.ivu.elect.business.stimmeingabe.boundary.AbstractStimmeingabefehlerDAO;
import de.ivu.elect.jee.protokollierung.VorherNachherWert;

public class NlErgebniseingang {

  private final Ergebniseingang ergebniseingang;

  public static final String PROTOKOLL_ERZEUGT_DURCH = "NlErgebniseingang#PROTOKOLL_ERZEUGT_DURCH";

  public static final String PROTOKOLL_ERZEUGT_AM = "NlErgebniseingang#PROTOKOLL_ERZEUGT_AM";

  public static final String PROTOKOLL = "NlErgebniseingang#PROTOKOLL";

  public NlErgebniseingang(Ergebniseingang ergebniseingang) {
    super();

    this.ergebniseingang = ergebniseingang;
  }

  public Long getEingangssequenznummer() {
    return ergebniseingang.getEingangssequenznummer();
  }

  public Long getErgebnissequenznummer() {
    return ergebniseingang.getErgebnissequenznummer();
  }

  public String getEingabeHashCode() {
    return ergebniseingang.getEingabeHashCode();
  }

  public Ergebniseingabestufe getErgebniseingabestufe() {
    return ergebniseingang.getErgebniseingabestufe();
  }

  public Ergebniseingangsart getErgebniseingangsart() {
    return ergebniseingang.getErgebniseingangsart();
  }

  public Ergebniseingangsfehlerstatus getErgebniseingangsfehlerstatus() {
    return ergebniseingang.getErgebniseingangsfehlerstatus();
  }

  public Collection<String> getStimmeingabefehlerBeschreibungen(AbstractStimmeingabefehlerDAO stimmeingabefehlerDAO) {
    return ergebniseingang.getStimmeingabefehlerBeschreibungen(stimmeingabefehlerDAO);
  }

  public Ergebniseingangsherkunft getErgebniseingangsherkunft() {
    return ergebniseingang.getErgebniseingangsherkunft();
  }

  public String getErfasser() {
    return ergebniseingang.getErfasser();
  }

  public Date getZeitstempel() {
    return ergebniseingang.getZeitstempel();
  }

  public boolean isProtokoll() {
    return ergebniseingang.getId() == null || ergebniseingang.getId() < 0;
  }

  public String getProtokollErzeugtDurch() {
    Object value = getProtokollAttribut(PROTOKOLL_ERZEUGT_DURCH);

    if (value instanceof String) {
      return (String) value;
    }

    return "";
  }

  public Date getProtokollErzeugtAm() {
    Object value = getProtokollAttribut(PROTOKOLL_ERZEUGT_AM);

    if (value instanceof Date) {
      return (Date) value;
    }

    return null;
  }

  public String getProtokoll() {
    Object value = getProtokollAttribut(PROTOKOLL);

    if (value instanceof String) {
      return (String) value;
    }

    return "";
  }

  private Object getProtokollAttribut(String key) {
    VorherNachherWert vorherNachherWert = ergebniseingang.getProtokollierteAttributeMitWerten().get(key);

    if (vorherNachherWert != null) {
      return vorherNachherWert.getNachher();
    }

    return null;
  }

  public static Ergebniseingang asErgebniseingangProtokolliert(Wahldurchfuehrungsgebiet wahldurchfuehrungsgebiet, Ergebniseingang ergebniseingang) {
    ergebniseingang.setId(-1 * System.nanoTime());
    ergebniseingang.setWahldurchfuehrungsgebiet(wahldurchfuehrungsgebiet);

    return ergebniseingang;
  }
}
