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

import java.util.HashSet;
import java.util.List;
import java.util.stream.Collectors;

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

import org.apache.commons.lang3.StringUtils;

import de.ivu.elect.business.datei.entity.DateiImportBerichtCustomData;
import de.ivu.elect.business.exchange.control.AbstractImporter;
import de.ivu.elect.business.exchange.control.ImportExchange;
import de.ivu.elect.business.exchange.entity.ImportUpdateReport;
import de.ivu.elect.business.internet.control.InternetKonfigurationImportExchange;
import de.ivu.elect.business.internet.control.InternetSeiteCreate;
import de.ivu.elect.business.internet.control.InternetWidgetCreate;
import de.ivu.elect.business.internet.entity.InternetKonfigurationExchangeContext;
import de.ivu.elect.business.internet.entity.InternetKonfigurationExchangeObject;
import de.ivu.elect.business.internet.entity.InternetSeite;
import de.ivu.elect.business.internet.entity.InternetSeiteMeta;
import de.ivu.elect.business.internet.entity.InternetWidget;
import de.ivu.elect.business.wahl.entity.Wahl;
import de.ivu.elect.jee.entity.Meta;
import de.ivu.elect.jee.exchange.ImportOptions;
import de.ivu.elect.jee.exchange.Violations;

@Stateless
public class InternetKonfigurationImporter extends AbstractImporter<InternetKonfigurationExchangeObject, InternetKonfigurationExchangeContext, DateiImportBerichtCustomData> {

  @Inject
  private transient InternetSeiteDAO internetSeiteDAO;

  @Inject
  private transient InternetSeiteCreate internetSeiteCreate;

  @Inject
  private transient InternetWidgetCreate internetWidgetCreate;

  @Inject
  private transient InternetSeiteMeta meta;

  @Inject
  private transient InternetKonfigurationImportExchange importExchange;

  @Override
  protected void validiere(Violations violations, InternetKonfigurationExchangeObject internetKonfigurationExchangeObject, InternetKonfigurationExchangeContext internetKonfigurationExchangeContext, ImportOptions importOptions) {
    for (var internetSeite : internetKonfigurationExchangeObject.getInternetSeiten()) {
      validateEntity(violations, internetSeite, internetSeite);
      for (var internetWidget : internetSeite.getInternetWidgetsByInternetSeite()) {
        validateEntity(violations, internetWidget, internetWidget);
      }
    }
  }

  @Override
  protected void erstelleBericht(InternetKonfigurationExchangeObject internetKonfigurationExchangeObject, InternetKonfigurationExchangeContext internetKonfigurationExchangeContext, ImportOptions importOptions, StringBuilder bericht, boolean vorab) {

  }

  @Override
  protected ImportUpdateReport createImportUpdateReport(InternetKonfigurationExchangeObject internetKonfigurationExchangeObject, Violations violations, InternetKonfigurationExchangeContext internetKonfigurationExchangeContext, ImportOptions importOptions, StringBuilder bericht) {
    return new ImportUpdateReport(violations, internetKonfigurationExchangeObject.getInternetSeiten().size(), 0,
        getBestehendeSeiten(internetKonfigurationExchangeContext.getWahl()).size(), importOptions, bericht);
  }

  @Override
  protected void anlegenWennNichtVorhanden(InternetKonfigurationExchangeObject internetKonfigurationExchangeObject, InternetKonfigurationExchangeContext internetKonfigurationExchangeContext, DateiImportBerichtCustomData customDateiImportBericht, StringBuilder bericht) {
    persistieren(internetKonfigurationExchangeContext.getWahl(), internetKonfigurationExchangeObject.getInternetSeiten());
  }

  public void persistieren(Wahl wahl, List<InternetSeite> internetSeiten) {
    var bestehendeNamen = getBestehendeSeiten(wahl).stream().map(InternetSeite::getTitel).collect(Collectors.toSet());
    for (var internetSeite : internetSeiten) {
      var widgets = new HashSet<InternetWidget>(internetSeite.getInternetWidgetsByInternetSeite());
      if (StringUtils.isNotBlank(internetSeite.getTitel())) {

        // ELECT-8194 Titel eindeutig halten
        long count = 0;
        var originalTitel = internetSeite.getTitel();
        while (!bestehendeNamen.add(internetSeite.getTitel())) {
          count++;
          internetSeite.setTitel(originalTitel + "_" + count);
        }
      }
      internetSeite.removeAllInternetWidgetByInternetSeites();
      internetSeite.setWahl(wahl);
      internetSeiteCreate.save(internetSeite);

      for (var widget : widgets) {
        widget.setInternetSeite(internetSeite);
        internetWidgetCreate.save(widget);
      }

    }
  }

  @Override
  protected void aktualisiereBestehendenDaten(InternetKonfigurationExchangeObject internetKonfigurationExchangeObject, InternetKonfigurationExchangeContext internetKonfigurationExchangeContext, DateiImportBerichtCustomData customDateiImportBericht, StringBuilder bericht) {
    throw new UnsupportedOperationException();
  }

  @Override
  protected void loescheBestehendenDatenWennNichtInImportDatenVorhanden(InternetKonfigurationExchangeObject internetKonfigurationExchangeObject, InternetKonfigurationExchangeContext internetKonfigurationExchangeContext, DateiImportBerichtCustomData customDateiImportBericht, StringBuilder bericht) {
    throw new UnsupportedOperationException();
  }

  protected List<InternetSeite> getBestehendeSeiten(Wahl wahl) {
    return internetSeiteDAO.findByWahl(wahl);
  }

  @Override
  protected ImportExchange<InternetKonfigurationExchangeObject, InternetKonfigurationExchangeContext> getExchange() {
    return importExchange;
  }

  @Override
  protected Meta getMetaForEntityInternal() {
    return meta;
  }

  @Override
  protected boolean isUnterstuetztAnlegenWennNichtVorhanden() {
    return true;
  }

  @Override
  protected boolean isUnterstuetztAktualisiereBestehendenDaten() {
    return false;
  }

  @Override
  protected boolean isUnterstuetztLoescheBestehendenDatenWennNichtInImportDatenVorhanden() {
    return false /*ELECT-8194*/;
  }

}
