package de.ivu.elect.presentation.praesentation;

import java.io.Serializable;

import javax.inject.Inject;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import de.ivu.elect.business.ergebnis.boundary.ErgebnisDAO;
import de.ivu.elect.business.ergebnis.boundary.ErgebnisSessionSelect;
import de.ivu.elect.business.ergebnis.entity.Ergebnis;
import de.ivu.elect.business.ergebnis.entity.ErgebnisPK;
import de.ivu.elect.business.gebietsbaum.boundary.WahldurchfuehrungsgebietExtendedDAO;
import de.ivu.elect.business.internet.boundary.PraesentationKonfigurieren;
import de.ivu.elect.business.internet.control.PresentationGenerieren;
import de.ivu.elect.business.internet.control.PresentationGenerierenZuExportierendesErgebnis;
import de.ivu.elect.business.mandant.entity.Mandant;
import de.ivu.elect.business.praesentation.entity.PraesentationBereitstellen;
import de.ivu.elect.business.wahl.entity.WahlParameterExtendedLoader;
import de.ivu.elect.business.wahl.entity.WahlParameterWerte;
import de.ivu.elect.business.wahl.entity.Wahldurchfuehrung;
import de.ivu.elect.jee.faces.Messages;

public class PraesentationExportieren implements Serializable {

  private static final Logger LOG = LoggerFactory.getLogger(PraesentationExportieren.class);

  private static final long serialVersionUID = 1L;

  @Inject
  private transient ErgebnisSessionSelect ergebnisSessionSelect;

  @Inject
  private transient PraesentationKonfigurieren praesentationKonfigurieren;

  @Inject
  private transient PresentationGenerieren presentationGenerieren;

  @Inject
  private transient WahlParameterExtendedLoader wahlParameterExtendedLoader;

  @Inject
  private transient WahldurchfuehrungsgebietExtendedDAO wahldurchfuehrungsgebietExtendedDAO;

  @Inject
  private transient Messages messages;

  @Inject
  private transient ErgebnisDAO ergebnisDAO;

  public Boolean isVerzeichnisKonfiguriert(Mandant mandant) {
    return praesentationKonfigurieren.isVerzeichnisKonfiguriert(mandant);
  }

  public void exportiereInternetPraesentation() {
    var ergebnis = getErgebnis();
    if (ergebnis != null) {
      try {
        if (isPraesentationBereitstellen(ergebnis)) {
          var zuExportieren = new PresentationGenerierenZuExportierendesErgebnis(ergebnis);
          if (presentationGenerieren.isErstellenMoeglich(zuExportieren)) {
            presentationGenerieren.erzeugePraesentationFuerErgebnis(zuExportieren);
            messages.addInfoMessage("praesentation.konfiguration.internet.exportieren.success", ergebnis.getWahl().getName(),
                messages.lokalisiere(ergebnis.getErgebnisart()));
          } else {
            messages.addWarnMessage("praesentation.konfiguration.internet.exportieren.nicht.moeglich");
          }
        } else {
          messages.addWarnMessage("praesentation.konfiguration.internet.exportieren.deaktiviert", ergebnis.getWahl().getName(),
              messages.lokalisiere(ergebnis.getErgebnisart()));
        }
      } catch (Exception loggedException) {
        LOG.warn("Fehler beim Export der Internetpräsentation.", loggedException);
        messages.addErrorMessage("praesentation.konfiguration.internet.exportieren.failure",
            new Object[]{ergebnis.getWahl().getName(), messages.lokalisiere(ergebnis.getErgebnisart()), loggedException.getLocalizedMessage()});
      }
    }
  }

  private boolean isPraesentationBereitstellen(Ergebnis ergebnis) {
    return PresentationGenerieren.isPraesentationBereitstellen(ergebnis.getWahl().castTo(Wahldurchfuehrung.class).getEntity(),
        wahlParameterExtendedLoader.resolveEnumValue(ergebnis.getWahl(), WahlParameterWerte.PREASENTATIION_STATUS, PraesentationBereitstellen.class),
        wahldurchfuehrungsgebietExtendedDAO);
  }

  private Ergebnis getErgebnis() {
    return ergebnisSessionSelect.getEntity();
  }

  public boolean isExportierenMoeglich() {
    var ergebnis = getErgebnis();
    if (ergebnis == null) {
      return false;
    }

    if (!isPraesentationBereitstellen(ergebnis)) {
      return false;
    }
    return isMapperVorhanden(ergebnis);
  }

  public boolean isMapperVorhanden(ErgebnisPK ergebnisPK) {
    return isMapperVorhanden(ergebnisDAO.findByPrimaryKey(ergebnisPK));
  }

  private boolean isMapperVorhanden(Ergebnis ergebnis) {
    return presentationGenerieren.isErstellenMoeglich(new PresentationGenerierenZuExportierendesErgebnis(ergebnis));
  }
}