package de.ivu.elect.business.praesentation.boundary;

import java.io.Serializable;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.stream.Collectors;

import javax.ejb.Stateless;
import javax.inject.Inject;

import org.apache.commons.lang3.StringUtils;

import de.ivu.elect.business.internet.boundary.InternetSeiteDAO;
import de.ivu.elect.business.internet.boundary.InternetWidgetDAO;
import de.ivu.elect.business.internet.control.PraesentationExportInternetSeitenExtractor;
import de.ivu.elect.business.internet.entity.InternetSeite;
import de.ivu.elect.business.internet.entity.InternetSeiteStatus;
import de.ivu.elect.business.wahl.boundary.WahlDAO;
import de.ivu.elect.business.wahl.entity.Wahl;
import de.ivu.elect.business.wahl.entity.WahlParameterLoader;
import de.ivu.elect.business.wahl.entity.WahlParameterWerte;

@Stateless
public class PraesentationStatusHelper implements Serializable {
  private static final long serialVersionUID = 1L;

  @Inject
  private transient PraesentationExportInternetSeitenExtractor praesentationExportInternetSeitenExtractor;

  @Inject
  private transient WahlDAO wahlDAO;

  @Inject
  private transient InternetSeiteDAO internetSeiteDAO;

  @Inject
  private transient InternetWidgetDAO internetWidgetDAO;

  @Inject
  private transient WahlParameterLoader wahlParameterLoader;

  public boolean isInternetSeitenInWahlVorhanden(Wahl wahlNotAttached) {
    return wahlNotAttached != null && !internetSeiteDAO.findByWahl(wahlNotAttached).isEmpty();
  }

  public boolean isDokumentvorlageVerwenden(Wahl wahlNotAttached) {
    return wahlNotAttached != null && praesentationExportInternetSeitenExtractor.isDokumentvorlageVerwenden(wahlDAO.attach(wahlNotAttached));
  }

  public boolean isInternetSeitenInDokumentvorlageVorhanden(Wahl wahlNotAttached) {
    return wahlNotAttached != null && praesentationExportInternetSeitenExtractor.isInternetSeitenInDokumentvorlageVorhanden(wahlDAO.attach(wahlNotAttached));
  }

  public void dokumentvorlagenAktivieren(Wahl wahlNotAttached) {
    var parameter = wahlParameterLoader
        .getParameter(wahlDAO.attach(wahlNotAttached), WahlParameterWerte.PREASENTATIION_INTERNET_SEITEN_AUS_DOKUMENTVORLAGE_VERWENDEN);

    if (parameter != null) {
      parameter.setWert(Boolean.TRUE.toString());
    }
  }

  public void dokumentvorlagenDeaktivieren(Wahl wahlNotAttached) {
    var parameter = wahlParameterLoader
        .getParameter(wahlDAO.attach(wahlNotAttached), WahlParameterWerte.PREASENTATIION_INTERNET_SEITEN_AUS_DOKUMENTVORLAGE_VERWENDEN);

    if (parameter != null) {
      parameter.setWert(Boolean.FALSE.toString());
    }
  }

  public void standardDokumentVorlageWiederherstellen(Wahl wahlNotAttached) {
    var wahl = wahlDAO.attach(wahlNotAttached);

    var standardSeiten = praesentationExportInternetSeitenExtractor.extrahiereInternetSeiten(wahl);
    var namenStandardSeiten = standardSeiten.stream().map(InternetSeite::getTitel).filter(StringUtils::isNotBlank).collect(Collectors.toSet());
    var suffix = new SimpleDateFormat("yyyyMMddHHmmss").format(new Date());

    for (var internetSeite : internetSeiteDAO.findByWahl(wahl)) {
      internetSeite.setPosition(9999L);
      if (namenStandardSeiten.contains(internetSeite.getTitel())) {
        internetSeite.setTitel(internetSeite.getTitel() + "_" + suffix);
      }
      internetSeite.setStatus(InternetSeiteStatus.DEAKTIVIERT);
    }

    for (var internetSeite : standardSeiten) {
      internetSeiteDAO.persist(internetSeite);
      // ELECTKOM-1009
      for (var internetWidget : internetSeite.getInternetWidgetsByInternetSeite()) {
        internetWidgetDAO.persist(internetWidget);
      }
    }
  }
}
