
package de.ivu.elect.presentation.kandidatur.action;

import javax.annotation.Nonnull;
import javax.inject.Inject;

import de.ivu.elect.business.kandidatur.boundary.ErsatzkandidaturPruefer;
import de.ivu.elect.business.kandidatur.boundary.ListenkandidaturEdit;
import de.ivu.elect.business.kandidatur.entity.Kandidatur;
import de.ivu.elect.business.kandidatur.entity.Listenkandidatur;
import de.ivu.elect.business.kandidatur.entity.ListenkandidaturArt;
import de.ivu.elect.presentation.kandidatur.ListenkandidaturSearchView;

public abstract class AbstractListenkandidaturListenkandidaturArtSetzenAction extends AbstractListenkandidaturAction {

  private static final long serialVersionUID = 1L;

  @Inject
  protected transient ListenkandidaturEdit listenkandidaturEdit;

  @Inject
  protected transient ErsatzkandidaturPruefer ersatzkandidaturPruefer;

  public AbstractListenkandidaturListenkandidaturArtSetzenAction() {
    super();
  }

  @Override
  protected boolean isDisabledInternal(Listenkandidatur listenkandidatur) {
    return super.isDisabledInternal(listenkandidatur) || getZuSetzendeListenkandidaturArt().equals(listenkandidatur.getListenkandidaturArt())
        || !isAnzahlListenkandidaturMarkiertAlsErsatzkandidaturMaximalKonfiguriert(listenkandidatur);
  }

  @Override
  protected boolean isDisabledInternalOnRowDblselect(Kandidatur kandidatur) {
    return true;
  }

  protected boolean isAnzahlListenkandidaturMarkiertAlsErsatzkandidaturMaximalKonfiguriert(Listenkandidatur listenkandidatur) {
    return ersatzkandidaturPruefer.checkListenkandidaturMarkiertAlsErsatzkandidaturHinzufuegen(listenkandidatur.getWahl(), listenkandidatur).isAnzahlErsatzkandidaturenMaximalKonfiguriert();
  }

  protected abstract ListenkandidaturArt getZuSetzendeListenkandidaturArt();

  @Override
  protected String doIt(@Nonnull Listenkandidatur template) {
    Listenkandidatur listenkandidatur = asListenkandidatur(template);

    if (listenkandidatur != null) {
      listenkandidatur.setListenkandidaturArt(getZuSetzendeListenkandidaturArt());

      listenkandidaturEdit.save(listenkandidatur);
    }

    return ListenkandidaturSearchView.VIEW_ID;
  }

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

  @Override
  public String getIcon() {
    return appIcons.getIconZuweisen();
  }
}
