
package de.ivu.elect.presentation.stimmzettel.exchange;

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

import javax.annotation.Nullable;
import javax.inject.Inject;
import javax.inject.Named;

import de.ivu.elect.business.dokumente.boundary.DokumentVorlageExtendedDAO;
import de.ivu.elect.business.dokumente.control.ElectDokumentContext;
import de.ivu.elect.business.dokumente.entity.DokumentVorlage;
import de.ivu.elect.business.exchange.control.AbstractExporter;
import de.ivu.elect.business.exchange.control.FileFormat;
import de.ivu.elect.business.gruppe.boundary.GruppeLogoFuerStimmzettelPruefer;
import de.ivu.elect.business.gruppe.entity.Gruppe;
import de.ivu.elect.business.security.UseCasePermission;
import de.ivu.elect.business.stimmzettel.boundary.StimmzettelExporter;
import de.ivu.elect.business.stimmzettel.control.StimmzettelExportContext;
import de.ivu.elect.business.stimmzettel.control.StimmzettelExportObject;
import de.ivu.elect.jee.faces.PreConditionCheck;
import de.ivu.elect.jee.presentation.dynamicform.FormBuilder;
import de.ivu.elect.presentation.View;
import de.ivu.elect.presentation.dokumente.DokumentVorlageProperty;
import de.ivu.elect.presentation.dokumente.ElectDokumentContextGenerator;
import de.ivu.elect.presentation.exchange.AbstractExportSearchView;
import de.ivu.elect.presentation.exchange.ExportDescription;
import de.ivu.elect.presentation.hilfe.OnlineHilfeId;
import de.ivu.elect.util.StringJoiner;

@OnlineHilfeId("348")
@Named(StimmzettelExportView.COMPONENT_NAME)
@View(viewId = StimmzettelExportView.VIEW_ID, useCase = UseCasePermission.STIMMZETTEL_EXPORTIEREN)
public class StimmzettelExportView extends AbstractExportSearchView<StimmzettelExportObject, StimmzettelExportContext> {

  private static final long serialVersionUID = 1L;

  public static final String COMPONENT_NAME = "stimmzettelExportView";

  public static final String VIEW_ID = "/stimmzettel/stimmzettel-export.xhtml";

  @Inject
  private transient StimmzettelExporter exporter;

  @Inject
  private transient StimmzettelExportDescription exportDescription;

  @Inject
  private transient ElectDokumentContextGenerator electDokumentContextGenerator;

  @Inject
  private transient GruppeLogoFuerStimmzettelPruefer gruppeLogoFuerStimmzettelPruefer;

  private StimmzettelExportContext context;

  public StimmzettelExportView() {
    super();
  }

  @Nullable
  @Override
  @PreConditionCheck
  public String checkPreCondition() {
    List<Gruppe> gruppenMitLogoNichtKonform = gruppeLogoFuerStimmzettelPruefer.bestimmeGruppenMitLogoNichtStimmzettelKonform(getSelectedWahl());
    if (!gruppenMitLogoNichtKonform.isEmpty()) {
      List<String> kurznamen = gruppenMitLogoNichtKonform.stream().map(Gruppe::getKurzname).sorted().collect(Collectors.toList());
      addWarningMessage("stimmzettel.export.warnung.logo.inkompatibel", StringJoiner.joinWithComma(kurznamen), kurznamen.size());
    }
    return super.checkPreCondition();
  }

  @Override
  protected AbstractExporter<StimmzettelExportObject, StimmzettelExportContext> getExporter() {
    return exporter;
  }

  public String getPageTitle() {
    return getMessage("stimmzettel.export.page.title", getSelectedGebietNameFormatted());
  }

  public String getPageHeader() {
    return getMessage("stimmzettel.export.page.header", getSelectedGebietNameFormatted());
  }

  @Override
  public ExportDescription getExportDescription() {
    return exportDescription;
  }

  @Override
  protected StimmzettelExportContext getContext() {
    ElectDokumentContext electDokumentContext = electDokumentContextGenerator.createElectDokumentContext();

    StimmzettelExportContext stimmzettelExportContext = new StimmzettelExportContext(electDokumentContext, getSelectedGebiet(), getSelectedDokumentVorlage());

    if (isLegacyStimmzettelExportMitEinzelnerDokumentVorlage(stimmzettelExportContext)) {
      return stimmzettelExportContext;
    }

    if (context == null) {
      context = new StimmzettelExportContext(electDokumentContext, getSelectedGebiet());
    }

    return context;
  }

  /**
   * @deprecated POC für ELECTKOM-480, Hilfsmethode, um nicht ALLE Exporte zu crashen...
   */
  @Deprecated
  @Override
  protected boolean isExportParameterModelDynamic() {
    return !isLegacyStimmzettelExportMitEinzelnerDokumentVorlage(getContext()); // Bei Auswahl eines Formates das DynaForm-Model neu bauen...
  }

  /**
   * @deprecated
   * @see AbstractExportSearchView#addProperties
   * @see AbstractStimmzettelExportFormBuilder#addProperties
   */
  @Inject
  @Deprecated
  private transient DokumentVorlageExtendedDAO dokumentVorlageExtendedDAO;

  /**
   * @deprecated
   * @see AbstractExportSearchView#addProperties
   * @see AbstractStimmzettelExportFormBuilder#addProperties
   */
  @Deprecated
  private DokumentVorlageProperty dokumentVorlageProperty;

  @Deprecated
  private Boolean existsLegacyStimmzettelExportMapperMitEinzelnerDokumentVorlage;

  /**
   * @deprecated
   * @see AbstractExportSearchView#addProperties
   * @see AbstractStimmzettelExportFormBuilder#addProperties
   */
  @Deprecated
  public void preRenderView() {
    if (isLegacyStimmzettelExportMitEinzelnerDokumentVorlage(getContext()) && findAvailableDokumentVorlagen().isEmpty()) {
      addWarningMessage("dokument.vorlage.nicht.hinterlegt", getMessage(exportDescription.getDokumentVorlageArt()));
    }
  }

  /**
   * @deprecated
   * @see AbstractExportSearchView#addProperties
   * @see AbstractStimmzettelExportFormBuilder#addProperties
   */
  @Override
  @Deprecated
  protected void addProperties(FormBuilder formBuilder, FileFormat fileFormat, StimmzettelExportContext context) {
    if (isLegacyStimmzettelExportMitEinzelnerDokumentVorlage(context)) {
      formBuilder.addProperty(getDokumentVorlageProperty());
    }

    super.addProperties(formBuilder, fileFormat, context);
  }

  /**
   * @deprecated
   * @see AbstractExportSearchView#addProperties
   * @see AbstractStimmzettelExportFormBuilder#addProperties
   */
  @Deprecated
  private boolean isLegacyStimmzettelExportMitEinzelnerDokumentVorlage(StimmzettelExportContext context) {
    if (existsLegacyStimmzettelExportMapperMitEinzelnerDokumentVorlage == null) {
      existsLegacyStimmzettelExportMapperMitEinzelnerDokumentVorlage = exporter.isDokumentVorlageBenoetigt(context);
    }

    return existsLegacyStimmzettelExportMapperMitEinzelnerDokumentVorlage;
  }

  /**
   * @deprecated
   * @see AbstractExportSearchView#addProperties
   * @see AbstractStimmzettelExportFormBuilder#addProperties
   */
  @Deprecated
  private DokumentVorlageProperty getDokumentVorlageProperty() {
    if (dokumentVorlageProperty == null) {
      dokumentVorlageProperty = new DokumentVorlageProperty(findAvailableDokumentVorlagen());
    }

    return dokumentVorlageProperty;
  }

  /**
   * @deprecated
   * @see AbstractExportSearchView#addProperties
   * @see AbstractStimmzettelExportFormBuilder#addProperties
   */
  @Deprecated
  private DokumentVorlage getSelectedDokumentVorlage() {
    if (dokumentVorlageProperty == null) {
      return null;
    }

    return dokumentVorlageProperty.getValue();
  }

  /**
   * @deprecated
   * @see AbstractExportSearchView#addProperties
   * @see AbstractStimmzettelExportFormBuilder#addProperties
   */
  @Deprecated
  private List<DokumentVorlage> findAvailableDokumentVorlagen() {
    return dokumentVorlageExtendedDAO.findByWahlAndArtOrderByName(getSelectedWahl(), exportDescription.getDokumentVorlageArt());
  }

  @Override
  protected void reset() {
    super.reset();

    context = null;

    existsLegacyStimmzettelExportMapperMitEinzelnerDokumentVorlage = null;
  }
}
