
package de.ivu.elect.presentation.gebietsbaum;

import static java.util.stream.Collectors.toList;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import javax.annotation.Nullable;
import javax.enterprise.event.Observes;
import javax.enterprise.event.Reception;
import javax.inject.Inject;

import org.apache.deltaspike.core.api.scope.ConversationGroup;
import org.apache.deltaspike.core.api.scope.GroupedConversation;
import org.apache.deltaspike.core.api.scope.GroupedConversationScoped;

import de.ivu.elect.business.gebietsbaum.boundary.GebietsgruppierungExtendedDAO;
import de.ivu.elect.business.gebietsbaum.entity.Gebietsgruppierung;
import de.ivu.elect.business.gebietsbaum.entity.GebietsgruppierungPK;
import de.ivu.elect.business.wahl.boundary.WahlSelectChangeEvent;
import de.ivu.elect.business.wahl.boundary.WahlterminSelectChangeEvent;

@GroupedConversationScoped
@ConversationGroup(NlWasGebietsgruppierungConversationStore.class)
public class NlWasGebietsgruppierungConversationStore implements Serializable {

  private static final long serialVersionUID = 1L;

  @Inject
  private transient GebietsgruppierungExtendedDAO gebietsgruppierungExtendedDAO;

  @Inject
  private transient GroupedConversation conversation;

  private List<GebietsgruppierungPK> entityPKs;

  private String postSaveViewId;

  public NlWasGebietsgruppierungConversationStore() {
    super();

    this.entityPKs = new ArrayList<>();
  }

  @Nullable
  public String getPostSaveViewId() {
    return postSaveViewId;
  }

  public void setPostSaveViewId(String postSaveViewId) {
    this.postSaveViewId = postSaveViewId;
  }

  public List<Gebietsgruppierung> getEntities() {
    return getEntityPKs().stream().map(gebietsgruppierungExtendedDAO::findByPrimaryKey).collect(toList());
  }

  public void setEntities(List<Gebietsgruppierung> entities) {
    setEntityPKs(entities.stream().map(Gebietsgruppierung::getPk).collect(toList()));
  }

  public List<GebietsgruppierungPK> getEntityPKs() {
    return entityPKs;
  }

  public void setEntityPKs(List<GebietsgruppierungPK> entityPKs) {
    this.entityPKs = entityPKs;
  }

  public void close() {
    conversation.close();
  }

  public void onWahlSelectChangeEvent(@Observes(notifyObserver = Reception.IF_EXISTS) WahlSelectChangeEvent event) {
    close();
  }

  public void onWahlterminSelectChangeEvent(@Observes(notifyObserver = Reception.IF_EXISTS) WahlterminSelectChangeEvent event) {
    close();
  }
}
