
package de.ivu.elect.presentation.stimmzettel;

import java.util.function.BooleanSupplier;

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

import de.ivu.elect.business.gebietsbaum.entity.Gebiet;
import de.ivu.elect.business.security.UseCasePermission;
import de.ivu.elect.business.stimmeingabe.entity.ErgebniseingangErfasser;
import de.ivu.elect.business.stimmzettel.boundary.ErgebniseingangAusStimmzettelCreate;
import de.ivu.elect.business.stimmzettel.boundary.StimmzettelErfassung;
import de.ivu.elect.business.stimmzettel.entity.Stimmzettel;
import de.ivu.elect.business.stimmzettel.entity.StimmzettelKopfdatumArt;
import de.ivu.elect.jee.entity.customdata.EmptyCustomData;
import de.ivu.elect.jee.faces.FacesContextUtil;
import de.ivu.elect.jee.faces.PreConditionCheck;
import de.ivu.elect.jee.presentation.charts.PieChartModelBuilder;
import de.ivu.elect.jee.presentation.dynamicform.FormBuilder;
import de.ivu.elect.jee.presentation.dynamicform.ReadOnlyBooleanProperty;
import de.ivu.elect.jee.presentation.dynamicform.ReadOnlyLongProperty;
import de.ivu.elect.jee.presentation.redirect.Redirect;
import de.ivu.elect.presentation.AbstractElectStatusuebersichtView;
import de.ivu.elect.presentation.View;
import de.ivu.elect.presentation.stimmeingabe.StimmeingabeErfassenViewResolver;

@RequestScoped
@Named(StimmzettelStatusuebersichtView.COMPONENT_NAME)
@View(viewId = StimmzettelStatusuebersichtView.VIEW_ID, useCase = UseCasePermission.STIMMZETTEL_STATUSUEBERSICHT_ANZEIGEN)
public class StimmzettelStatusuebersichtView extends AbstractElectStatusuebersichtView<Stimmzettel> {

  private static final long serialVersionUID = 1L;

  public static final String COMPONENT_NAME = "stimmzettelStatusuebersichtView";

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

  @Inject
  private transient ErgebniseingangAusStimmzettelCreate ergebniseingangAusStimmzettelCreate;

  @Inject
  private transient StimmeingabeErfassenViewResolver stimmeingabeErfassenViewResolver;

  @Inject
  private transient StimmzettelErfassung stimmzettelErfassung;

  @Inject
  private transient StimmzettelStimmeingabeMoeglichStore stimmzettelStimmeingabeMoeglichStore;

  public StimmzettelStatusuebersichtView() {
    super();
  }

  @Nullable
  @PreConditionCheck
  public String checkPreCondition() {
    if (isGebietSelected()) {
      return null;
    }

    return getStartViewId();
  }

  @Override
  protected Stimmzettel getEntity() {
    return new Stimmzettel(EmptyCustomData.INSTANCE); // Dummy
  }

  @Override
  protected void addProperties(FormBuilder formBuilder, Stimmzettel entity) {
    Gebiet selectedGebiet = getSelectedGebiet();
    if (selectedGebiet != null && selectedGebiet.isErfassungsgebiet()) {
      formBuilder.addProperty(new ReadOnlyLongProperty(getMessage(StimmzettelKopfdatumArt.ANZAHL_STIMMZETTEL_GESAMT), stimmzettelErfassung.getAnzahlStimmzettelGesamt(selectedGebiet)));
      formBuilder.addProperty(new ReadOnlyLongProperty(getMessage("stimmzettel.status.noch.zu.erfassen"), stimmzettelErfassung.getAnzahlNochZuErfassenderStimmzettel(selectedGebiet)));
      formBuilder.addProperty(new ReadOnlyBooleanProperty(getMessage("stimmzettel.status.abgeschlossen"), stimmzettelErfassung.isErfassungAbgeschlossen(selectedGebiet)));
    }
  }

  @Override
  protected void fillStatusPieChartModel(PieChartModelBuilder modelBuilder) {

  }

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

  public boolean isErgebniseingangAnlegenRendered() {
    return hasPermission(UseCasePermission.STIMMZETTEL_ERGEBNISEINGANG_ANLEGEN) && getBearbeitenGebietSecurity().isRechtVorhanden(getSelectedGebiet());
  }

  public boolean isErgebniseingangAnlegenDisabled() {
    Gebiet selectedGebiet = getSelectedGebiet();
    return selectedGebiet == null || !selectedGebiet.isErfassungsgebiet() || !isStimmeingabeMoeglich(selectedGebiet);
  }

  private boolean isStimmeingabeMoeglich(Gebiet gebiet) {
    return stimmzettelStimmeingabeMoeglichStore.isStimmeingabeMoeglich(gebiet);
  }

  @Redirect
  public String ergebniseingangAnlegen() {
    if (ergebniseingangAusStimmzettelCreate.ergebniseingangAnlegen(getSelectedGebiet(), getErfasser(), getErgebniseingangsherkunftIgnorieren())) {
      addInfoMessage("stimmzettel.statusuebersicht.ergebniseingang.angelegt");

      if (hasPermission(stimmeingabeErfassenViewResolver.getViewIdPermission())) {
        return stimmeingabeErfassenViewResolver.getViewId();
      }
    } else {
      addErrorMessage("stimmzettel.aus.ergebniseingang.create.fehler");
    }

    return FacesContextUtil.getCurrentViewId();
  }

  private ErgebniseingangErfasser getErfasser() {
    return ErgebniseingangErfasser.benutzer(getPrincipal());
  }

  private BooleanSupplier getErgebniseingangsherkunftIgnorieren() {
    return () -> hasPermission(UseCasePermission.STIMMEINGABE_CREATE_EINGANGSHERKUNFT_IGNORIEREN);
  }

  public String getErgebniseingangAnlegenLabel() {
    return getMessage("stimmzettel.statusuebersicht.ergebniseingang.anlegen");
  }
}
