
package de.ivu.elect.presentation.wahlvorschlag;

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

import javax.inject.Inject;
import javax.inject.Named;

import de.ivu.elect.business.gebietsbaum.entity.Gebiet;
import de.ivu.elect.business.wahlvorschlag.boundary.ListeExtendedDAO;
import de.ivu.elect.business.wahlvorschlag.entity.Liste;
import de.ivu.elect.business.wahlvorschlag.entity.Listenverbindung;
import de.ivu.elect.jee.faces.PreConditionCheck;
import de.ivu.elect.jee.presentation.dynamicform.FormBuilder;
import de.ivu.elect.presentation.hilfe.OnlineHilfeId;
import de.ivu.elect.presentation.wahlvorschlag.form.ListenverbindungViewFormBuilder;

@OnlineHilfeId("263")
@Named(ListenverbindungCreateView.COMPONENT_NAME)
public class ListenverbindungCreateView extends AbstractListenverbindungCreateView {

  private static final long serialVersionUID = 1L;

  @Inject
  private transient ListeExtendedDAO listeExtendedDAO;

  @Inject
  private transient ListenverbindungViewFormBuilder listenverbindungViewFormBuilder;

  public ListenverbindungCreateView() {
    super();
  }

  @Override
  protected String getParentViewId() {
    return ListeSearchView.VIEW_ID;
  }

  @PreConditionCheck
  public String checkPreCondition() {
    if (isListengebietSelected()) {
      if (getVerfuegbareListen(getSelectedGebiet()).isEmpty()) {
        addWarningMessage("listenverbindung.create.keine.liste.message", getGebietName());
      }
      return null;
    }
    return cancel();
  }

  private List<Liste> getVerfuegbareListen(Gebiet gebiet) {
    List<Liste> result = new ArrayList<>();

    for (Liste liste : listeExtendedDAO.findByGebiet(gebiet)) {
      if (liste.getListenverbindung() == null) {
        result.add(liste);
      }
    }

    return result;
  }

  private boolean isListengebietSelected() {
    return isGebietSelected() && getSelectedGebiet().isListenwahlgebiet();
  }

  public String getGebietName() {
    return getSelectedGebietNameFormatted();
  }

  @Override
  public void addProperties(FormBuilder builder, Listenverbindung entity) {
    listenverbindungViewFormBuilder.addProperties(builder, entity, getSelectedGebiet());
  }
}
