
package de.ivu.elect.presentation.statistik;

import static java.util.Arrays.asList;

import java.util.ArrayList;
import java.util.List;

import javax.annotation.Nullable;
import javax.enterprise.event.Observes;
import javax.enterprise.event.Reception;
import javax.faces.convert.Converter;
import javax.inject.Inject;
import javax.inject.Named;

import org.apache.deltaspike.core.api.scope.ViewAccessScoped;

import de.ivu.elect.business.CurrentCustomer;
import de.ivu.elect.business.gebietsbaum.boundary.GebietSelectChangeEvent;
import de.ivu.elect.business.security.UseCasePermission;
import de.ivu.elect.business.statistik.boundary.StatistikKennzeichenSearchParameters;
import de.ivu.elect.business.statistik.boundary.StatistikLaufConversationSelect;
import de.ivu.elect.business.statistik.entity.StatistikKennzeichen;
import de.ivu.elect.business.statistik.entity.StatistikKennzeichenArt;
import de.ivu.elect.business.statistik.entity.StatistikKennzeichenProperties;
import de.ivu.elect.business.statistik.entity.StatistikKennzeichenSearchGebietauswahl;
import de.ivu.elect.business.statistik.entity.StatistikLauf;
import de.ivu.elect.business.wahl.boundary.WahlExtendedDAO;
import de.ivu.elect.business.wahl.entity.Wahl;
import de.ivu.elect.jee.entity.EagerLoadingCollector;
import de.ivu.elect.jee.faces.PreConditionCheck;
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 de.ivu.elect.presentation.security.AbstractGebietSecurityFilter;
import de.ivu.elect.presentation.statistik.table.StatistikKennzeichenColumnBuilder;
import de.ivu.elect.presentation.wahl.form.LambdaWahlSelectOneMenuProperty;

@OnlineHilfeId(value = "672")
@ViewAccessScoped
@Named(AbstractStatistikKennzeichenSearchView.COMPONENT_NAME)
@View(viewId = AbstractStatistikKennzeichenSearchView.VIEW_ID, useCase = UseCasePermission.STATISTIK_KENNZEICHEN_SEARCH)
public class StatistikKennzeichenSearchView extends AbstractStatistikKennzeichenSearchView {

  private static final long serialVersionUID = 1L;

  @Inject
  private transient CurrentCustomer currentCustomer;

  @Inject
  private transient StatistikLaufConversationSelect statistikLaufConversationSelect;

  @Inject
  private transient StatistikKennzeichenColumnBuilder statistikKennzeichenColumnBuilder;

  @Inject
  private transient WahlExtendedDAO wahlExtendedDAO;

  public StatistikKennzeichenSearchView() {
    super();
  }

  @Nullable
  @PreConditionCheck
  public String checkCondition() {
    if (!statistikLaufConversationSelect.isSelected() || !isGebietSelected()) {
      return StatistikLaufSearchView.VIEW_ID;
    }

    return null;
  }

  protected StatistikLauf getStatistikLauf() {
    return statistikLaufConversationSelect.getEntity();
  }

  public String getStatistikLaufZeitpunkt() {
    if (getStatistikLauf() != null) {
      return getUserLocale().formatDateTime(getStatistikLauf().getZeitpunktDesLaufs());
    }
    return "";
  }

  @Override
  protected AbstractGebietSecurityFilter<StatistikKennzeichen> getGebietSecurityFilter() {
    return AbstractGebietSecurityFilter.createEntityMitGebietSecurityFilter(getEinsehenGebietSecurity());
  }

  @Override
  public StatistikKennzeichenSearchParameters getSearchParameters() {
    StatistikKennzeichenSearchParameters searchParameters = super.getSearchParameters();
    searchParameters.setStatistikLauf(getStatistikLauf());
    searchParameters.setGebiet(getSelectedGebiet());

    return searchParameters;
  }

  @Override
  public void presetSearchParameters() {

  }

  @Override
  public void addProperties(FormBuilder formBuilder) {
    StatistikKennzeichenProperties statistikKennzeichenProperties = getSearchParameters().getStatistikKennzeichen().getProperties();

    formBuilder.addProperty(new LambdaEnumProperty<>(getMessage("statistik.kennzeichen.gebietauswahl"), true, getSearchParameters()::setGebietauswahl, getSearchParameters()::getGebietauswahl,
        StatistikKennzeichenSearchGebietauswahl.class, asList(StatistikKennzeichenSearchGebietauswahl.values())));

    LambdaEnumProperty<StatistikKennzeichenArt> kennzeichenProperty = statistikKennzeichenProperties.getKennzeichenMitLeererAuswahlProperty();
    kennzeichenProperty.setValueFilter(v -> currentCustomer.getCustomer().containsAny(v.getCustomers()));

    formBuilder.addProperty(kennzeichenProperty).withRequired(false);

    List<Wahl> wahlenSortiertNachPosition = new ArrayList<>(getSelectedWahltermin().getWahlenSortiertNachPosition());
    wahlenSortiertNachPosition.add(0, StatistikKennzeichenSearchParameters.ALLE_WAHLEN);

    formBuilder.addProperty(new LambdaWahlSelectOneMenuProperty(wahlExtendedDAO, wahlenSortiertNachPosition, wahl -> {
      if (StatistikKennzeichenSearchParameters.ALLE_WAHLEN.equals(wahl)) {
        return getMessage("statistik.kennzeichen.wahl.keine");
      }

      // ELECTMUC-2202 (bereits behoben)
      Wahl attach = wahlExtendedDAO.attach(wahl);

      if (attach == null) {
        return "";
      }

      return attach.getWahlart().getName();
    }, getSearchParameters()::setWahl, getSearchParameters()::getWahl) {

      @Override
      public Converter getDefaultConverter() {
        return new StatistikKennzeichenSearchViewWahlConverter();
      }
    });

    addLimitProperty(formBuilder);
  }

  @Override
  public EagerLoadingCollector<StatistikKennzeichen> getEagerLoadingCollector() {
    EagerLoadingCollector<StatistikKennzeichen> eagerLoadingCollector = super.getEagerLoadingCollector();

    statistikKennzeichenColumnBuilder.collectEagerLoadings(eagerLoadingCollector);

    return eagerLoadingCollector;
  }

  @Override
  public boolean isBtnGoBackRendered() {
    return statistikLaufConversationSelect.isSelected();
  }

  public void onGebietSelectChangeEvent(@Observes(notifyObserver = Reception.IF_EXISTS) GebietSelectChangeEvent event) {
    resetSearchResult();
  }
}
