
package de.ivu.elect.presentation.stimmzettel;

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

import javax.enterprise.inject.Specializes;
import javax.inject.Inject;

import de.ivu.elect.business.security.UseCasePermission;
import de.ivu.elect.business.stimmeingabe.entity.ErgebniseingangErfasser;
import de.ivu.elect.business.stimmzettel.boundary.WasStimmzettelEdit;
import de.ivu.elect.business.stimmzettel.entity.Stimmzettel;
import de.ivu.elect.jee.presentation.dynamicform.FormBuilder;
import de.ivu.elect.jee.presentation.redirect.Redirect;

@Specializes
public class WasStimmzettelEditView extends StimmzettelEditView {

  private static final long serialVersionUID = 1L;

  @Inject
  private transient StimmzettelStimmeingabeMoeglichStore stimmzettelStimmeingabeMoeglichStore;

  @Inject
  private transient WasStimmzettelEdit stimmzettelEdit;

  public WasStimmzettelEditView() {
    super();
  }

  @Override
  public void addProperties(FormBuilder formBuilder, Stimmzettel stimmzettel) {
    super.addProperties(formBuilder, stimmzettel);

    if (!stimmzettelStimmeingabeMoeglichStore.isStimmeingabeMoeglich(stimmzettel.getGebiet())) {
      formBuilder.globalReadonly();
    }
  }

  @Override
  public boolean isBtnSaveRendered() {
    return super.isBtnSaveRendered() && stimmzettelStimmeingabeMoeglichStore.isStimmeingabeMoeglich(getEntity().getGebiet());
  }

  @Override
  protected void callSave(Stimmzettel entity) {
    stimmzettelEdit.save(entity, getErfasser(), hasPermission(UseCasePermission.STIMMEINGABE_CREATE_EINGANGSHERKUNFT_IGNORIEREN));
  }

  @Override
  @Redirect
  public String deleteSearched(List<Stimmzettel> stimmzettelList) {
    List<Stimmzettel> zuLoeschen = new ArrayList<>();
    List<Stimmzettel> nichtZuLoeschen = new ArrayList<>();

    for (Stimmzettel stimmzettel : stimmzettelList) {
      if (stimmzettelStimmeingabeMoeglichStore.isStimmeingabeMoeglich(stimmzettel.getGebiet())) {
        zuLoeschen.add(stimmzettel);
      } else {
        nichtZuLoeschen.add(stimmzettel);
      }
    }

    if (!nichtZuLoeschen.isEmpty()) {
      addWarningMessage("was.stimmzettel.bulk.delete.nicht.moeglich", nichtZuLoeschen.size());
    }
    return super.deleteSearched(zuLoeschen);
  }

  @Override
  protected void executeDeleteSearched(List<Stimmzettel> stimmzettelList) {
    stimmzettelEdit.deleteSearched(stimmzettelList, getErfasser(), hasPermission(UseCasePermission.STIMMEINGABE_CREATE_EINGANGSHERKUNFT_IGNORIEREN));
  }

  @Override
  protected String delete(Stimmzettel entity) {
    stimmzettelEdit.delete(entity, getErfasser(), hasPermission(UseCasePermission.STIMMEINGABE_CREATE_EINGANGSHERKUNFT_IGNORIEREN));

    addMessageDeleteSuccess();

    resetStateAfterAction();

    return getParentViewId(); // definierter Parent, benutze deleteAndGoBack um zum vorherigen View zurückzukehren
  }

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