
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.ErgebnisStatus;
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.jee.faces.Messages;

public class WasErgebnisStatusInfo implements ErgebnisStatusInfo {

  private final String ergebnisHinweis;

  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;

  private final String additionalBadgeInfo;

  private final String badgeTooltip;

  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(),
        ergebnis == null ? null : ergebnis.getErgebnisStatus());
  }

  public WasErgebnisStatusInfo(Messages messages, Wahl wahl, ErgebniseingangKonfiguration ergebniseingangKonfiguration, Ergebnisart ergebnisart, ErgebnisStatus ergebnisStatus) {
    this(messages, wahl, ergebniseingangKonfiguration, ergebnisart, ergebnisStatus, 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, null, ergebniseingangsart, null, ergebniseingabestatus, "", "");
  }

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

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

  public WasErgebnisStatusInfo(WasErgebnisStatusInfo template, String ergebnisartFormatted, String ergebniseingabestufeFormatted, String ergebniseingabestatusFormatted, String additionalBadgeInfo,
      String badgeTooltip) {
    this( //
        template.ergebnisartVorlaeufig, //
        template.ergebnisartEndgueltig, //
        template.ergebnisartVariable, //

        "", //
        ergebnisartFormatted, //

        template.ergebniseingabestufeVariable, //
        ergebniseingabestufeFormatted, //
        ergebniseingabestatusFormatted, //

        additionalBadgeInfo, //
        badgeTooltip //
    );
  }

  private WasErgebnisStatusInfo(Messages messages, Wahl wahl, ErgebniseingangKonfiguration ergebniseingangKonfiguration, @Nullable Ergebnisart ergebnisart, @Nullable ErgebnisStatus ergebnisStatus,
      @Nullable Ergebniseingangsart ergebniseingangsart, @Nullable Ergebniseingabestufe ergebniseingabestufe, @Nullable Ergebniseingabestatus ergebniseingabestatus, String additionalBadgeInfo,
      String badgeTooltip) {
    this( //
        ergebnisart != null ? ergebnisart.isVorlaeufig() : ergebniseingangsart != null ? ergebniseingangsart.isVorlaeufig() : false, //
        ergebnisart != null ? ergebnisart.isEndgueltig() : ergebniseingangsart != null ? ergebniseingangsart.isEndgueltig() : false, //
        ergebniseingangKonfiguration != null && ergebniseingangKonfiguration.isWechselErgebniseingangsartenUnterstuetzt(wahl), //

        formatErgebnisHinweis(messages, ergebnisStatus), // ELECT-16357
        ergebnisart != null ? messages.lokalisiere(ergebnisart) : ergebniseingangsart != null ? messages.lokalisiere(ergebniseingangsart) : "", //

        ergebniseingangKonfiguration != null && ergebniseingangKonfiguration.isWechselErgebniseingabestufenUnterstuetzt(wahl), //
        ergebniseingabestufe == null ? "" : messages.lokalisiere(ergebniseingabestufe), //
        ergebniseingabestatus == null ? "" : messages.lokalisiere(ergebniseingabestatus), //

        additionalBadgeInfo, //
        badgeTooltip //
    );
  }

  private WasErgebnisStatusInfo(boolean ergebnisartVorlaeufig, boolean ergebnisartEndgueltig, boolean ergebnisartVariable, String ergebnisHinweis, String ergebnisartFormatted,
      boolean ergebniseingabestufeVariable, String ergebniseingabestufeFormatted, String ergebniseingabestatusFormatted, String additionalBadgeInfo, String badgeTooltip) {
    super();

    this.ergebnisHinweis = ergebnisHinweis;

    this.ergebnisartFormatted = ergebnisartFormatted;

    this.ergebnisartVorlaeufig = ergebnisartVorlaeufig;
    this.ergebnisartEndgueltig = ergebnisartEndgueltig;
    this.ergebnisartVariable = ergebnisartVariable;

    this.ergebniseingabestufeFormatted = ergebniseingabestufeFormatted;
    this.ergebniseingabestufeVariable = ergebniseingabestufeVariable;

    this.ergebniseingabestatusFormatted = ergebniseingabestatusFormatted;

    this.additionalBadgeInfo = additionalBadgeInfo;

    this.badgeTooltip = badgeTooltip;
  }

  @Override
  public String getErgebnisHinweis() {
    return ergebnisHinweis;
  }

  private static String formatErgebnisHinweis(Messages messages, ErgebnisStatus ergebnisStatus) {
    if (ergebnisStatus != null) {
      String hinweisErgebnisStatusMsgKey = "kumulierte.stimmen.search.page.ergebnishinweis.ergebnisstatus." + ergebnisStatus.name();

      if (messages.isMessageKeyVorhanden(hinweisErgebnisStatusMsgKey)) {
        return messages.getMessageForMessageKey(hinweisErgebnisStatusMsgKey, messages.lokalisiere(ergebnisStatus));
      }
    }

    return "";
  }

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

  public String getErgebnisartFormatted() {
    return ergebnisartFormatted;
  }

  public String getErgebniseingabestufeFormatted() {
    return ergebniseingabestufeFormatted;
  }

  public String getErgebniseingabestatusFormatted() {
    return ergebniseingabestatusFormatted;
  }

  public String getAdditionalBadgeInfo() {
    return additionalBadgeInfo;
  }

  @Override
  public String getBadgeTooltip() {
    return badgeTooltip;
  }

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

    if (ergebnisartVariable) {
      result += getErgebnisartFormatted();
    }

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

      result += getErgebniseingabestufeFormatted();
    }

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

      result += getErgebniseingabestatusFormatted();
    }

    if (isNotBlank(getAdditionalBadgeInfo())) {
      result += " "/*non breaking space*/ + getAdditionalBadgeInfo();
    }

    return result;
  }

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

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