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

import de.ivu.elect.business.datei.entity.DateiImport;
import de.ivu.elect.business.exchange.control.AbstractImporter;
import de.ivu.elect.business.security.UseCasePermission;
import de.ivu.elect.business.stimmeingabe.boundary.StimmeingabeImporter;
import de.ivu.elect.business.stimmeingabe.control.StimmeingabeImportContext;
import de.ivu.elect.business.stimmeingabe.entity.Ergebniseingang;
import de.ivu.elect.business.stimmeingabe.entity.StimmeingabeImportUmgangFehlendeGebiete;
import de.ivu.elect.business.stimmeingabe.entity.StimmeingabeImportUmgangFehlendeKandidaten;
import de.ivu.elect.business.stimmeingabe.entity.StimmeingabeImportUmgangNichtZugelasseneKandidaten;
import de.ivu.elect.business.wahl.boundary.WahldurchfuehrungSessionSelect;
import de.ivu.elect.jee.presentation.dynamicform.FormBuilder;
import de.ivu.elect.jee.presentation.dynamicform.LambdaBooleanProperty;
import de.ivu.elect.jee.presentation.dynamicform.LambdaEnumProperty;
import de.ivu.elect.presentation.View;
import de.ivu.elect.presentation.exchange.AbstractImportBestaetigenView;
import de.ivu.elect.presentation.exchange.ImportDescription;

import javax.inject.Inject;
import javax.inject.Named;
import java.util.Arrays;
import java.util.List;

@Named(StimmeingabeImportBestaetigenView.COMPONENT_NAME)
@View(viewId = StimmeingabeImportBestaetigenView.VIEW_ID, useCase = UseCasePermission.STIMMEINGABE_IMPORTIEREN)
public class StimmeingabeImportBestaetigenView extends AbstractImportBestaetigenView<List<Ergebniseingang>, StimmeingabeImportContext> {

  private static final long serialVersionUID = 1L;

  public static final String COMPONENT_NAME = "stimmeingabeImportBestaetigenView";

  public static final String VIEW_ID = "/stimmeingabe/stimmeingabe-import-bestaetigen.xhtml";

  @Inject
  private transient WahldurchfuehrungSessionSelect wahldurchfuehrungSessionSelect;

  @Inject
  private transient StimmeingabeImporter stimmeingabeImporter;

  @Inject
  private transient StimmeingabeImportDescription stimmeingabeImportDescription;

  private StimmeingabeImportContext context;

  public StimmeingabeImportBestaetigenView() {
    super();
  }

  @Override
  protected AbstractImporter<List<Ergebniseingang>, StimmeingabeImportContext, ?> getImporter() {
    return stimmeingabeImporter;
  }

  @Override
  protected StimmeingabeImportContext getContext() {
    if (context == null) {
      context = new StimmeingabeImportContext(wahldurchfuehrungSessionSelect.getEntity(), getPrincipal());
    }

    return context;
  }

  @Override
  protected ImportDescription getImportDescription() {
    return stimmeingabeImportDescription;
  }

  @Override
  protected void addProperties(FormBuilder formBuilder, DateiImport dateiImport, StimmeingabeImportContext stimmeingabeImportContext) {
    // ELECTVAPP-2387 auf NL aufpassen(1)
    addValidierungProperties(formBuilder, stimmeingabeImportContext);
    super.addProperties(formBuilder, dateiImport, stimmeingabeImportContext);
    addAustauschstrategien(formBuilder);
  }

  protected void addValidierungProperties(FormBuilder formBuilder, StimmeingabeImportContext stimmeingabeImportContext) {
    formBuilder.addProperty(new LambdaBooleanProperty(getMessage("stimmeingabe.import.validierung.erforderlich"), false, stimmeingabeImportContext::setPlausibilisierungErzwingen, stimmeingabeImportContext::isPlausibilisierungErzwingen));
    formBuilder.addProperty(new LambdaBooleanProperty(getMessage("stimmeingabe.import.kann.fehler.bestaetigen"), false, stimmeingabeImportContext::setPlausibilisierungKannFehlerBestaetigen, stimmeingabeImportContext::isPlausibilisierungKannFehlerBestaetigen));
  }

  protected void addAustauschstrategien(FormBuilder formBuilder) {
    formBuilder.addProperty(new LambdaEnumProperty<>(
        getMessage("stimmeingabe.import.umgang.fehlende.gebiete"), true, e -> getContext().setUmgangFehlendeGebiete(e),
        () -> getContext().getUmgangFehlendeGebiete(),
        StimmeingabeImportUmgangFehlendeGebiete.class, Arrays.asList(StimmeingabeImportUmgangFehlendeGebiete.values())));
    formBuilder.addProperty(new LambdaEnumProperty<>(
        getMessage("stimmeingabe.import.umgang.nicht.zugelassene.kandidaten"), true, e -> getContext().setUmgangNichtZugelasseneKandidaten(e),
        () -> getContext().getUmgangNichtZugelasseneKandidaten(),
        StimmeingabeImportUmgangNichtZugelasseneKandidaten.class, Arrays.asList(StimmeingabeImportUmgangNichtZugelasseneKandidaten.values())));
    formBuilder.addProperty(new LambdaEnumProperty<>(
        getMessage("stimmeingabe.import.umgang.fehlende.kandidaten"), true, e -> getContext().setUmgangFehlendeKandidaten(e),
        () -> getContext().getUmgangFehlendeKandidaten(),
        StimmeingabeImportUmgangFehlendeKandidaten.class, Arrays.asList(StimmeingabeImportUmgangFehlendeKandidaten.values())));
  }

}
