
package de.ivu.elect.presentation.wahlausschuss;

import static java.util.Collections.emptyList;
import static java.util.Collections.singletonList;

import java.util.List;

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

import de.ivu.elect.business.entschaedigung.entity.Entschaedigung;
import de.ivu.elect.business.security.UseCasePermission;
import de.ivu.elect.business.security.UseCaseSecure;
import de.ivu.elect.business.wahlausschuss.boundary.WahlausschussEntschaedigungExtendedDAO;
import de.ivu.elect.business.wahlausschuss.entity.Wahlausschussmitglied;
import de.ivu.elect.jee.faces.PreConditionCheck;
import de.ivu.elect.jee.presentation.dynamicform.FormBuilder;
import de.ivu.elect.jee.presentation.redirect.Redirect;
import de.ivu.elect.presentation.View;
import de.ivu.elect.presentation.hilfe.OnlineHilfeId;
import de.ivu.elect.presentation.person.PersonendatenEntschaedigungEditView;
import de.ivu.elect.presentation.person.PersonendatenEntschaedigungEditViewHelper;
import de.ivu.elect.presentation.wahlausschuss.form.WahlausschussmitgliedEntschaedigungViewFormBuilder;

@OnlineHilfeId("680")
@RequestScoped
@Named(WahlausschussmitgliedEntschaedigungEditView.COMPONENT_NAME)
@View(viewId = WahlausschussmitgliedEntschaedigungEditView.VIEW_ID, useCase = UseCasePermission.ENTSCHAEDIGUNG_EDIT)
public class WahlausschussmitgliedEntschaedigungEditView extends AbstractWahlausschussmitgliedEditView implements PersonendatenEntschaedigungEditView {

  private static final long serialVersionUID = 1L;

  public static final String COMPONENT_NAME = "wahlausschussmitgliedEntschaedigungEditView";

  public static final String VIEW_ID = "/wahlausschuss/wahlausschussmitglied-entschaedigung-edit.xhtml";

  @Inject
  private transient WahlausschussEntschaedigungExtendedDAO wahlausschussEntschaedigungExtendedDAO;

  @Inject
  private transient PersonendatenEntschaedigungEditViewHelper personendatenEntschaedigungEditViewHelper;

  @Inject
  private transient WahlausschussmitgliedEntschaedigungViewFormBuilder wahlausschussmitgliedEntschaedigungViewFormBuilder;

  public WahlausschussmitgliedEntschaedigungEditView() {
    super();
  }

  @Override
  protected boolean isGebietBearbeitenRechtPruefen() {
    return true;
  }

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

  @Override
  @PreConditionCheck
  public String checkPreCondition() {
    if (isWahlausschussmitgliedSelected()) {
      return null;
    }

    return cancel();
  }

  private boolean isWahlausschussmitgliedSelected() {
    return isEntitySet();
  }

  @Override
  public void addProperties(FormBuilder formBuilder, Wahlausschussmitglied wahlausschussmitglied) {
    wahlausschussmitgliedEntschaedigungViewFormBuilder.addProperties(formBuilder, wahlausschussmitglied, calculateEntschaedigungen(wahlausschussmitglied), false);
  }

  private List<Entschaedigung> calculateEntschaedigungen(Wahlausschussmitglied wahlausschussmitglied) {
    // ELECTMUC-1285, dass WahlausschussEntschaedigung vorerst weiterverwendet wird!
    // return personendatenEntschaedigungEditViewHelper.calculateEntschaedigungen(CorePersonendatenArt.WAHLAUSSCHUSSMITGLIED, wahlausschussmitglied);

    return wahlausschussmitglied.getWahlausschussEntschaedigung(wahlausschussEntschaedigungExtendedDAO)
        .map(wahlausschussEntschaedigung -> singletonList(wahlausschussEntschaedigung.toEntschaedigung(getMessages(), wahlausschussmitglied))).orElse(emptyList());
  }

  @Override
  public boolean isBtnSaveRendered() {
    return super.isBtnSaveRendered() && personendatenEntschaedigungEditViewHelper.isBtnSaveRendered();
  }

  @Override
  @Redirect
  @UseCaseSecure(UseCasePermission.ENTSCHAEDIGUNG_EDIT)
  public String save() {
    // ELECTMUC-1285, dass WahlausschussEntschaedigung vorerst weiterverwendet wird und deshalb die (nur angezeigten) Entschädigungen nicht gespeichert werden!
    // personendatenEntschaedigungEditViewHelper.save();

    return super.save();
  }

  @Override
  protected void resetStateAfterAction() {
    personendatenEntschaedigungEditViewHelper.reset();

    super.resetStateAfterAction();
  }
}
