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

import javax.annotation.Nullable;

import org.apache.commons.lang3.StringUtils;

import de.ivu.elect.business.ergebnis.entity.Ergebnisart;
import de.ivu.elect.business.gebietsbaum.entity.Gebiet;
import de.ivu.elect.business.gebietsbaum.entity.Wahldurchfuehrungsgebiet;
import de.ivu.elect.business.stimmeingabe.entity.Ergebniseingabestatus;
import de.ivu.elect.jee.presentation.status.OutputSeverity;
import de.ivu.elect.presentation.gebietsbaum.GebietNummerFormatter;
import de.ivu.elect.presentation.stimmeingabe.status.GebietErfassungsstatusInErgebniseingabestufe;

public class ErgebniseingangStatusEntry extends GebietsbaumStatusEntry {

  private final GebietErfassungsstatusInErgebniseingabestufe gebietErfassungsstatus;

  private final Ergebnisart ergebnisart;

  public ErgebniseingangStatusEntry(Gebiet gebiet, GebietNummerFormatter gebietNummerFormatter, GebietErfassungsstatusInErgebniseingabestufe gebietErfassungsstatus, Ergebnisart ergebnisart) {
    super(createSeverity(gebietErfassungsstatus), gebiet, gebietNummerFormatter);

    this.gebietErfassungsstatus = gebietErfassungsstatus;
    this.ergebnisart = ergebnisart;
  }

  @Nullable
  private static OutputSeverity createSeverity(GebietErfassungsstatusInErgebniseingabestufe gebietErfassungsstatus) {
    if (gebietErfassungsstatus == null) {
      return null;
    }

    return gebietErfassungsstatus.getSeverity();
  }

  @Override
  protected String createLabel() {
    String result = super.createLabel();

    if (StringUtils.isNotBlank(result) && ergebnisart != null) {
      Gebiet gebiet = getGebiet();

      if (gebiet.isInstanceOf(Wahldurchfuehrungsgebiet.class)) {
        Wahldurchfuehrungsgebiet wahldurchfuehrungsgebiet = gebiet.castTo(Wahldurchfuehrungsgebiet.class).getEntity();

        Ergebniseingabestatus ergebniseingabestatus = wahldurchfuehrungsgebiet.getErgebniseingabestatus(ergebnisart);

        if (ergebniseingabestatus.isInternStatus()) {
          result = "(" + result + ")";
        } else if (ergebniseingabestatus.isExternStatus()) {
          result = "[" + result + "]";
        }
      }
    }

    return result;
  }

  public GebietErfassungsstatusInErgebniseingabestufe getGebietErfassungsstatus() {
    return gebietErfassungsstatus;
  }

  @Override
  public String toString() {
    return "ErgebniseingangStatusEntry{" +
        "gebietErfassungsstatus=" + gebietErfassungsstatus +
        ", ergebnisart=" + ergebnisart +
        "} " + super.toString();
  }
}
