
package de.ivu.elect.presentation.ergebnis;

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

import javax.annotation.Nullable;

import de.ivu.elect.business.ergebnis.entity.Ergebnis;
import de.ivu.elect.business.ergebnis.entity.Ergebnisart;
import de.ivu.elect.business.stimmeingabe.boundary.ErgebniseingangKonfiguration;
import de.ivu.elect.business.stimmeingabe.entity.Ergebniseingabestatus;
import de.ivu.elect.business.stimmeingabe.entity.Ergebniseingabestufe;
import de.ivu.elect.business.stimmeingabe.entity.Ergebniseingangsart;
import de.ivu.elect.business.wahl.entity.Wahl;
import de.ivu.elect.business.wahl.entity.WahlartErgebnisart;
import de.ivu.elect.jee.faces.Messages;

public class WasErgebnisStatusInfo implements ErgebnisStatusInfo {

  private final String ergebnisartFormatted;

  private final boolean ergebnisartVorlaeufig;

  private final boolean ergebnisartEndgueltig;

  private final boolean ergebnisartVariable;

  private final String ergebniseingabestufeFormatted;

  private final boolean ergebniseingabestufeVariable;

  private final String ergebniseingabestatusFormatted;

  public WasErgebnisStatusInfo(Messages messages, Wahl wahl, ErgebniseingangKonfiguration ergebniseingangKonfiguration, Ergebnis ergebnis) {
    this(messages, ergebnis == null ? wahl : ergebnis.getWahl() == null ? wahl : ergebnis.getWahl(), ergebniseingangKonfiguration, ergebnis == null ? null : ergebnis.getErgebnisart());
  }

  public WasErgebnisStatusInfo(Messages messages, Wahl wahl, ErgebniseingangKonfiguration ergebniseingangKonfiguration, Ergebnisart ergebnisart) {
    this(messages, wahl, ergebniseingangKonfiguration, ergebnisart, null, null, null);
  }

  public WasErgebnisStatusInfo(Messages messages, Wahl wahl, ErgebniseingangKonfiguration ergebniseingangKonfiguration, Ergebniseingangsart ergebniseingangsart) {
    this(messages, wahl, ergebniseingangKonfiguration, ergebniseingangsart, null, null);
  }

  public WasErgebnisStatusInfo(Messages messages, Wahl wahl, ErgebniseingangKonfiguration ergebniseingangKonfiguration, Ergebniseingangsart ergebniseingangsart,
      Ergebniseingabestufe ergebniseingabestufe) {
    this(messages, wahl, ergebniseingangKonfiguration, ergebniseingangsart, ergebniseingabestufe, null);
  }

  public WasErgebnisStatusInfo(Messages messages, Wahl wahl, ErgebniseingangKonfiguration ergebniseingangKonfiguration, Ergebniseingangsart ergebniseingangsart,
      Ergebniseingabestatus ergebniseingabestatus) {
    this(messages, wahl, ergebniseingangKonfiguration, null, ergebniseingangsart, null, ergebniseingabestatus);
  }

  public WasErgebnisStatusInfo(Messages messages, Wahl wahl, ErgebniseingangKonfiguration ergebniseingangKonfiguration, Ergebniseingangsart ergebniseingangsart,
      Ergebniseingabestufe ergebniseingabestufe, Ergebniseingabestatus ergebniseingabestatus) {
    this(messages, wahl, ergebniseingangKonfiguration, null, ergebniseingangsart, ergebniseingabestufe, ergebniseingabestatus);
  }

  private WasErgebnisStatusInfo(Messages messages, Wahl wahl, ErgebniseingangKonfiguration ergebniseingangKonfiguration, @Nullable Ergebnisart ergebnisart,
      @Nullable Ergebniseingangsart ergebniseingangsart, @Nullable Ergebniseingabestufe ergebniseingabestufe, @Nullable Ergebniseingabestatus ergebniseingabestatus) {
    super();

    this.ergebnisartFormatted = ergebnisart == null ? ergebniseingangsart == null ? "" : messages.lokalisiere(ergebniseingangsart) : messages.lokalisiere(ergebnisart);

    WahlartErgebnisart wahlartErgebnisart = ergebnisart == null ? ergebniseingangsart : ergebnisart;

    this.ergebnisartVorlaeufig = wahlartErgebnisart != null && wahlartErgebnisart.isVorlaeufig();
    this.ergebnisartEndgueltig = wahlartErgebnisart != null && wahlartErgebnisart.isEndgueltig();
    this.ergebnisartVariable = ergebniseingangKonfiguration != null && ergebniseingangKonfiguration.isWechselErgebniseingangsartenUnterstuetzt(wahl);

    this.ergebniseingabestufeFormatted = ergebniseingabestufe == null ? "" : messages.lokalisiere(ergebniseingabestufe);
    this.ergebniseingabestufeVariable = ergebniseingangKonfiguration != null && ergebniseingangKonfiguration.isWechselErgebniseingabestufenUnterstuetzt(wahl);

    this.ergebniseingabestatusFormatted = ergebniseingabestatus == null ? "" : messages.lokalisiere(ergebniseingabestatus);
  }

  @Override
  public String getPrintInfo() {
    return getBadgeInfo();
  }

  @Override
  public String getBadgeInfo() {
    String result = "";

    if (ergebnisartVariable) {
      result += ergebnisartFormatted;
    }

    if (isNotBlank(ergebniseingabestufeFormatted) && ergebniseingabestufeVariable) {
      if (isNotBlank(result)) {
        result += " - ";
      }

      result += ergebniseingabestufeFormatted;
    }

    if (isNotBlank(ergebniseingabestatusFormatted)) {
      if (isNotBlank(result)) {
        result += " - ";
      }

      result += ergebniseingabestatusFormatted;
    }

    return result;
  }

  @Override
  public String getBadgeInfoStyleClass() {
    if (ergebnisartVorlaeufig) {
      return "page-content-header-info-status-1";
    }

    return "page-content-header-info-status-2";
  }
}
