package de.ivu.elect.presentation.stimmeingabe;

import java.io.Serializable;

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.GebietExtendedDAO;
import de.ivu.elect.business.gebietsbaum.boundary.GebietSessionSelect;
import de.ivu.elect.business.gebietsbaum.entity.Gebiet;
import de.ivu.elect.business.wahl.boundary.WahlSelectChangeEvent;
import de.ivu.elect.business.wahl.boundary.WahlterminSelectChangeEvent;

/**
 *  on 19.09.2016.
 * ELECT-4744
 */
@GroupedConversationScoped
@ConversationGroup(EingangsStatusViewGebietAnzeigeStore.class)
public class EingangsStatusViewGebietAnzeigeStore implements Serializable {

  private static final Long ALLE_GEBIET_ANZEIGEN_GRENZE = 350L;

  private static final long serialVersionUID = 1L;

  @Inject
  private transient GebietSessionSelect gebietSessionSelect;

  @Inject
  private transient GebietExtendedDAO gebietExtendedDAO;

  private EingangsStatusViewGebietAnzeige eingangsStatusViewGebietAnzeige;

  @Inject
  private GroupedConversation conversation;

  public EingangsStatusViewGebietAnzeige getEingangsStatusViewGebietAnzeige() {
    if (eingangsStatusViewGebietAnzeige == null) {
      return getEingangsStatusViewGebietAnzeigeDefault(); // nicht setzen => wird für jede Ebene ermittelt
    }
    return eingangsStatusViewGebietAnzeige;
  }

  public void setEingangsStatusViewGebietAnzeige(EingangsStatusViewGebietAnzeige eingangsStatusViewGebietAnzeige) {
    this.eingangsStatusViewGebietAnzeige = eingangsStatusViewGebietAnzeige;
  }

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

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

  public void reset() {
    conversation.close();
    eingangsStatusViewGebietAnzeige = null;
  }

  protected EingangsStatusViewGebietAnzeige getEingangsStatusViewGebietAnzeigeDefault() {
    if (gebietSessionSelect.isSelected()) {
      Gebiet gebiet = gebietSessionSelect.getEntity();
      // Wenn das oberste Gebiet, dann nur alle anzeigen, wenn die Anzahl der Erfassungsgebiete begrenzt ist...die Anzeige dauert sonst im IE zu lange
      if (gebiet.hasUebergeordnetesGebiet() || gebietExtendedDAO.findByCountErfassungsgebieteByWahl(gebiet.getWahl()) <= ALLE_GEBIET_ANZEIGEN_GRENZE) {
        return EingangsStatusViewGebietAnzeige.ALLE;
      }
    }
    return EingangsStatusViewGebietAnzeige.KEINE;
  }

  public boolean isButtonZurAuswahlEingangsStatusAnzeigen() {
    return true;
  }

}
