
package de.ivu.elect.presentation.ergebnis;

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

import javax.annotation.Nullable;
import javax.enterprise.context.RequestScoped;
import javax.inject.Inject;
import javax.inject.Named;

import org.apache.deltaspike.core.api.scope.ConversationGroup;
import org.primefaces.model.charts.donut.DonutChartModel;

import de.ivu.elect.business.ergebnis.boundary.AbstractErgebnisLogEintragSearchParameters;
import de.ivu.elect.business.ergebnis.boundary.AbstractSitzeSearchParameters;
import de.ivu.elect.business.ergebnis.boundary.ErgebnisLogEintragSearch;
import de.ivu.elect.business.ergebnis.boundary.ErgebnisLogEintragSearchParameters;
import de.ivu.elect.business.ergebnis.boundary.ErgebnisSessionSelect;
import de.ivu.elect.business.ergebnis.boundary.SitzeSearch;
import de.ivu.elect.business.ergebnis.boundary.SitzeSearchParameters;
import de.ivu.elect.business.ergebnis.entity.ErgebnisLogEintrag;
import de.ivu.elect.business.ergebnis.entity.ErgebnisLogEintragArt;
import de.ivu.elect.business.ergebnis.entity.Sitze;
import de.ivu.elect.business.ergebniskonflikt.boundary.AbstractErgebnisKonfliktSearchParameters;
import de.ivu.elect.business.ergebniskonflikt.boundary.ErgebnisKonfliktSearch;
import de.ivu.elect.business.ergebniskonflikt.boundary.ErgebnisKonfliktSearchParameters;
import de.ivu.elect.business.ergebniskonflikt.entity.ErgebnisKonflikt;
import de.ivu.elect.business.gebietsbaum.boundary.GebietExtendedDAO;
import de.ivu.elect.business.gebietsbaum.control.EntityMitWurzelgebietDAO;
import de.ivu.elect.business.gebietsbaum.entity.Gebiet;
import de.ivu.elect.business.gebietsbaum.entity.NlGebiet;
import de.ivu.elect.business.kandidatur.boundary.AbstractKandidaturSearchParameters;
import de.ivu.elect.business.kandidatur.boundary.KandidaturSearch;
import de.ivu.elect.business.kandidatur.boundary.KandidaturSearchParameters;
import de.ivu.elect.business.kandidatur.entity.Kandidatur;
import de.ivu.elect.business.kandidatur.entity.NlKandidatur;
import de.ivu.elect.business.search.control.AbstractElectSearchParameters;
import de.ivu.elect.business.security.UseCasePermission;
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.presentation.AbstractElectSearchView;
import de.ivu.elect.presentation.View;
import de.ivu.elect.presentation.ergebnis.table.SitzeColumnBuilder;
import de.ivu.elect.presentation.hilfe.OnlineHilfeId;
import de.ivu.elect.presentation.security.AbstractGebietSecurityFilter;

@RequestScoped
@OnlineHilfeId("TODO")
@Named(NlWasErgebnisUebersichtSearchView.COMPONENT_NAME)
@View(viewId = NlWasErgebnisUebersichtSearchView.VIEW_ID, useCase = UseCasePermission.ERGEBNIS_STATUSUEBERSICHT_ANZEIGEN)
public class NlWasErgebnisUebersichtSearchView extends AbstractElectSearchView<Gebiet> {


    private static final long serialVersionUID = 1L;

    public static final String COMPONENT_NAME = "nlWasErgebnisUebersichtSearchView";

    public static final String VIEW_ID = "/ergebnis/nl-ergebnis-uebersicht.xhtml";

    @Inject
    protected ErgebnisSessionSelect ergebnisSelect;
    @Inject
    protected transient ErgebnisKonfliktSearch ergebnisKonfliktSearch;

    @Inject
    @ConversationGroup(AbstractErgebnisKonfliktSearchParameters.class)
    protected transient ErgebnisKonfliktSearchParameters ergebnisKonfliktSearchParameters;
    @Inject
    protected ErgebnisSessionSelect ergebnisSessionSelect;

    @Inject
    protected transient ErgebnisLogEintragSearch besonderheitenSearch;

    @Inject
    @ConversationGroup(AbstractErgebnisLogEintragSearchParameters.class)
    protected transient ErgebnisLogEintragSearchParameters besonderheitenSearchParameters;


    @Inject
    protected transient SitzeSearch sitzeSearch;

    @Inject
    @ConversationGroup(AbstractSitzeSearchParameters.class)
    protected transient SitzeSearchParameters sitzeSearchParameters;

    @Inject
    protected transient KandidaturSearch kandidaturSearch;

    @Inject
    @ConversationGroup(AbstractKandidaturSearchParameters.class)
    protected transient KandidaturSearchParameters kandidaturSearchParameters;
    @Inject
    private transient GebietExtendedDAO gebietExtendedDAO;
    @Inject
    private transient SitzeColumnBuilder sitzeColumnBuilder;


    @Nullable
    @PreConditionCheck
    public String checkCondition() {
        if (getWurzelgebiet() == null) {
            return getStartViewId();
        }

        return null;
    }


    public List<Sitze> getSitzeSearchResults() {

        sitzeSearchParameters.setGebiet(getWurzelgebiet());
        return sitzeSearch.getSearchResult(sitzeSearchParameters, new EagerLoadingCollector<>());

    }

    private Gebiet getWurzelgebiet() {
        Wahl wahl = getSelectedWahl();
        if (wahl != null) {
            return wahl.getWurzelgebiet(EntityMitWurzelgebietDAO.fromDao(gebietExtendedDAO));

        }
        return null;
    }


    public List<ErgebnisLogEintrag> getBesonderheitSearchResults() {
        besonderheitenSearchParameters.setErgebnis(ergebnisSessionSelect.getEntity());
        besonderheitenSearchParameters.setErgebnisLogEintragArt(ErgebnisLogEintragArt.BESONDERHEIT);

        return besonderheitenSearch.getSearchResult(besonderheitenSearchParameters, new EagerLoadingCollector<>());

    }

    public List<ErgebnisKonflikt> getErgebnisKonfliktSearchResults() {
        ergebnisKonfliktSearchParameters.setErgebnis(ergebnisSelect.getEntity());

        return ergebnisKonfliktSearch.getSearchResult(ergebnisKonfliktSearchParameters, new EagerLoadingCollector<>());
    }


    @Override
    protected String getViewId() {
        return VIEW_ID;
    }

    @Override
    public AbstractElectSearchParameters getSearchParameters() {
        return null;
    }


    public List<Kandidatur> getVerstorbeneSearchResult() {//ELECT-11712
        kandidaturSearchParameters.setGruppe(null);
        kandidaturSearchParameters.setGebiet(getWurzelgebiet());//ELECT-11701
        return kandidaturSearch.getSearchResult(kandidaturSearchParameters, new EagerLoadingCollector<>()).
                stream().filter(kandidatur -> new NlKandidatur(kandidatur).isVerstorben()).collect(Collectors.toList());

    }

    public List<Gebiet> getVoteValuesSearchResult() { // ELECT-13527
      return NlGebiet.collectVoteValueGebiete(getSelectedWahl(), gebietExtendedDAO);
    }

    public DonutChartModel getPieChartModel() {
        return new SitzeDonutChartModelBuilder(sitzeColumnBuilder).getChartModel(getSitzeSearchResults());

    }

    @Override
    protected List runSearch() {
        return null;
    }

    @Override
    protected List<Gebiet> performSearch() {
        return null;
    }

    @Override
    protected AbstractGebietSecurityFilter<Gebiet> getGebietSecurityFilter() {
        return null;
    }


    @Override
    public boolean isSupportsLazyLoading() {
        return false;
    }

    @Override
    protected void presetSearchParameters() {

    }


    @Override
    public void addProperties(FormBuilder formBuilder) {

    }
}
