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

import java.util.function.Supplier;

import javax.enterprise.inject.Specializes;
import javax.inject.Inject;

import org.apache.commons.lang3.StringUtils;

import de.ivu.elect.business.gebietsbaum.entity.Gebiet;
import de.ivu.elect.business.gebietsbaum.entity.NlGebiet;
import de.ivu.elect.business.gebietsbaum.entity.Wahldurchfuehrungsgebiet;
import de.ivu.elect.business.stimmeingabe.control.LetzterEingangCache;
import de.ivu.elect.business.stimmeingabe.entity.Ergebniseingabestufe;
import de.ivu.elect.business.wahl.entity.Wahldurchfuehrung;
import de.ivu.elect.jee.faces.Messages;


import static de.ivu.elect.jee.entity.EntityUtil.castTo;

@Specializes
public class NlWasGebietsbaumDynamicIconResolver extends WasGebietsbaumDynamicIconResolver {

  private static final long serialVersionUID = 1L;

  //  @Inject
  //  private transient ErgebniseingangExtendedDAO ergebniseingangExtendedDAO;

  @Inject
  private transient Messages messages;

  @Inject
  private transient LetzterEingangCache letzterEingangCache;

  public NlWasGebietsbaumDynamicIconResolver() {
    super();
  }

  @Override
  public String getDynamischenNameNummerFormatiert(String nameNummerFormatiert, Supplier<Gebiet> gebietSupplier) {
    var result = super.getDynamischenNameNummerFormatiert(nameNummerFormatiert, gebietSupplier);

    var wahldurchfuehrungsgebiet = castTo(gebietSupplier.get(), Wahldurchfuehrungsgebiet.class);

    if (wahldurchfuehrungsgebiet.isErfassungsgebiet()) {
      // ELECTVAPP-1969 cache verwenden
      //      Ergebniseingang letzterErgebniseingangAktuell = gebiet
      //          .getLetzterErgebniseingangAktuell(ergebniseingangExtendedDAO, gebiet.getWahl().castTo(Wahldurchfuehrung.class).getEntity().getErgebniseingangsart());

      var wahldurchfuehrung = castTo(wahldurchfuehrungsgebiet.getWahl(), Wahldurchfuehrung.class);

      var letzterErgebniseingangAktuell = letzterEingangCache.getLetzterEingang(wahldurchfuehrung.getPk(), wahldurchfuehrungsgebiet.getPk(),
          wahldurchfuehrung.getErgebniseingangsart());

      var ergebniseingabestufe = Ergebniseingabestufe.VORSTUFE_01; // kein Eingang => erste Stufe

      if (letzterErgebniseingangAktuell.isEingangVorhanden() /* ELECTVAPP-1969 letzterErgebniseingangAktuell != null */) {
        ergebniseingabestufe = letzterErgebniseingangAktuell.getErgebniseingabestufe();
      }

      // ELECT-15271
      var korrekturenStimmeingabenStatus = new NlGebiet(wahldurchfuehrungsgebiet).getKorrekturenStimmeingabenStatus();

      var resultWithIcon = getMessage("nl.was.gebietsbaum." + ergebniseingabestufe.name(), result);

      var iconGebietsbaum = korrekturenStimmeingabenStatus.getIconGebietsbaum(getMessages());
      if (StringUtils.isBlank(iconGebietsbaum)) {
        return resultWithIcon;
      }

      return getMessage("nl.was.gebietsbaum.extra.icon", resultWithIcon, iconGebietsbaum);
    }

    return result;
  }

  @Override
  protected boolean isErfassungsViewAktiv() {
    return true; // ELECTVAPP-2128 Status bei NL immer anzeigen
  }

  @Override
  protected String getGebietDynamischesIcon(String icon, WasGebietsbaumErfassungStatus wasGebietsbaumErfassungStatus) {
    return icon; // ELECTVAPP-390
  }

  private String getMessage(String msgKey, Object... params) {
    return getMessages().getMessageForMessageKey(msgKey, params);
  }

  private Messages getMessages() {
    return messages;
  }
}
