package de.ivu.elect.presentation.stimmeingabe;

import de.ivu.elect.business.security.UseCasePermission;
import de.ivu.elect.business.stimmeingabe.entity.StimmeingabePlausiFehlerart;
import de.ivu.elect.business.stimmeingabe.entity.StimmeingabePlausiGebietsart;
import de.ivu.elect.business.stimmeingabe.entity.StimmeingabePlausiKonfigurationConstants;
import de.ivu.elect.jee.presentation.dynamicform.FormBuilder;
import de.ivu.elect.jee.presentation.dynamicform.LambdaEnumProperty;
import de.ivu.elect.presentation.View;
import de.ivu.elect.presentation.hilfe.OnlineHilfeId;
import org.apache.deltaspike.core.api.scope.ViewAccessScoped;

import javax.enterprise.inject.Specializes;
import java.util.ArrayList;
import java.util.List;

import static java.util.Arrays.stream;
import static java.util.stream.Collectors.toList;

@Specializes
@OnlineHilfeId("727")
@ViewAccessScoped
@View(viewId = AbstractStimmeingabePlausiKonfigurationSearchView.VIEW_ID, useCase = UseCasePermission.STIMMEINGABE_PLAUSI_SEARCH)
public class NlStimmeingabePlausiKonfigurationSearchView extends StimmeingabePlausiKonfigurationSearchView {

  /**
   * NOTE: Kein Aufruf von super, da ViewFormBuilder bei NL unabhängig vom allgemeinen Produkt sind. (ELECT-9878)
   */
  @Override
  public void addProperties(FormBuilder formBuilder) {
    findStimmeingabePlausiDefinitions().ifPresent(stimmeingabePlausiDefinitions -> {
      List<StimmeingabePlausiGebietsart> gebietsarten = new ArrayList<>(stimmeingabePlausiDefinitions.collectGebietsartenRelevant());

      if (gebietsarten.size() > 1) {
        formBuilder.addProperty(new LambdaEnumProperty<>(getMessage(StimmeingabePlausiKonfigurationConstants.MESSAGE_KEY_PLAUSI_GEBIETSART_EINZAHL), false, searchParameters::setGebietsart,
            searchParameters::getGebietsart, StimmeingabePlausiGebietsart.class, gebietsarten, true));
      }
    });

    List<StimmeingabePlausiFehlerart> fehlerarten = stream(StimmeingabePlausiFehlerart.values()) //
        .filter(fehlerart -> !fehlerart.isUnbekannt()) //
        .collect(toList());

    formBuilder.addProperty(new LambdaEnumProperty<>(getMessage(StimmeingabePlausiKonfigurationConstants.MESSAGE_KEY_PLAUSI_FEHLERART_EINZAHL), false, searchParameters::setFehlerart,
        searchParameters::getFehlerart, StimmeingabePlausiFehlerart.class, fehlerarten, true));
  }
}
