
package de.ivu.elect.presentation.wahlvorschlagsperson;

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

import de.ivu.elect.business.gebietsbaum.boundary.GebietSelectChangeEvent;
import de.ivu.elect.business.gruppe.boundary.PolitischeGruppeExtendedDAO;
import de.ivu.elect.business.kandidatur.boundary.KandidaturConversationSelect;
import de.ivu.elect.business.kandidatur.entity.Kandidatur;
import de.ivu.elect.business.wahl.entity.Wahl;
import de.ivu.elect.business.wahlvorschlag.boundary.WahlvorschlagConversationSelect;
import de.ivu.elect.business.wahlvorschlag.entity.Wahlvorschlag;
import de.ivu.elect.business.wahlvorschlagsperson.boundary.WahlvorschlagsPersonSearchParameters;
import de.ivu.elect.business.wahlvorschlagsperson.entity.WahlvorschlagsPerson;
import de.ivu.elect.business.wahlvorschlagsperson.entity.WahlvorschlagsPersonConstants;
import de.ivu.elect.jee.faces.PreConditionCheck;
import de.ivu.elect.jee.presentation.dynamicform.FormBuilder;
import de.ivu.elect.jee.presentation.search.AbstractSearchParameters;
import de.ivu.elect.presentation.hilfe.OnlineHilfeId;
import de.ivu.elect.presentation.person.PersonendatenFormatter;
import de.ivu.elect.presentation.security.AbstractGebietSecurityFilter;
import de.ivu.elect.presentation.veranstaltung.TeilnehmerEinladenView;
import de.ivu.elect.util.StringJoiner;

@OnlineHilfeId("448")
@Named(AbstractWahlvorschlagsPersonSearchView.COMPONENT_NAME)
public class WahlvorschlagsPersonSearchView extends AbstractWahlvorschlagsPersonSearchView implements TeilnehmerEinladenView {

  private static final long serialVersionUID = 1L;

  @Inject
  private transient PolitischeGruppeExtendedDAO politischeGruppeDao;

  @Inject
  private transient WahlvorschlagConversationSelect wahlvorschlagConversationSelect;

  @Inject
  private transient KandidaturConversationSelect kandidaturConversationSelect;

  @Inject
  private transient PersonendatenFormatter personendatenFormatter;

  public WahlvorschlagsPersonSearchView() {
    super();
  }

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

    return getStartViewId();
  }

  @Override
  protected AbstractGebietSecurityFilter<WahlvorschlagsPerson> getGebietSecurityFilter() {
    return AbstractGebietSecurityFilter.createEntityMitGebietSecurityFilter(getEinsehenGebietSecurity());
  }

  public String getPageTitle() {
    return getMessage("entity.search.page.title", getMessage(WahlvorschlagsPersonConstants.MESSAGE_KEY_ENTITY_MEHRZAHL));
  }

  public String getPageHeader() {
    if (isWahlvorschlagSelected() || isKandidaturSelected()) {
      return getMessage("wahlvorschlagsperson.search.page.header", getMessage(WahlvorschlagsPersonConstants.MESSAGE_KEY_ENTITY_MEHRZAHL), StringJoiner.joinWithCustomSeparator(" - ", getWahlvorschlagKennwort(), getKandidaturName()));
    }

    return getMessage("entity.mit.gebiet.search.page.header", getMessage(WahlvorschlagsPersonConstants.MESSAGE_KEY_ENTITY_MEHRZAHL), getGebietName());
  }

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

  public void onGebietSelectChangeEvent(@Observes(notifyObserver = Reception.IF_EXISTS) GebietSelectChangeEvent event) {
    resetSearchResult();
  }

  protected Wahl getWahl() {
    return getSelectedGebiet().getWahl();
  }

  public boolean isWahlvorschlagSelected() {
    return wahlvorschlagConversationSelect.isSelected();
  }

  private Wahlvorschlag getWahlvorschlag() {
    return wahlvorschlagConversationSelect.getEntity();
  }

  public String getWahlvorschlagKennwort() {
    if (isWahlvorschlagSelected()) {
      return getWahlvorschlag().getKennwort();
    }

    return "";
  }

  public boolean isKandidaturSelected() {
    return kandidaturConversationSelect.isSelected();
  }

  private Kandidatur getKandidatur() {
    return kandidaturConversationSelect.getEntity();
  }

  public String getKandidaturName() {
    if (isKandidaturSelected()) {
      return personendatenFormatter.getVornameUndFamiliennameFuerAnzeige(getKandidatur());
    }

    return "";
  }

  @Override
  public boolean isSearchParametersRendered() {
    return super.isSearchParametersRendered() && !isWahlvorschlagSelected() && !isKandidaturSelected();
  }

  public boolean isPageMenuDisabled() { //ELECT-11239
    return !isSearchParametersRendered();
  }

  @Override
  public WahlvorschlagsPersonSearchParameters getSearchParameters() {
    // NOTE ELECTDD-40, dass der Wechsel eines Wahlvorschlages IMMER am Suchparameter sichtbar sein muss und dass aber
    // (aktuell) kein entsprechendes ConversationSelectChangeEvent existiert, auf das gehört werden könnte!
    searchParameters.setWahlvorschlag(getWahlvorschlag());
    searchParameters.setKandidatur(getKandidatur());

    return super.getSearchParameters();
  }

  @Override
  public void presetSearchParameters() {
    resetSearchParameters();
    resetSearchParametersModel();
  }

  private void resetSearchParameters() {
    searchParameters.setGebiet(getSelectedGebiet());
    searchParameters.setWahlvorschlag(getWahlvorschlag());
    searchParameters.setKandidatur(getKandidatur());
  }

  @Override
  public void addProperties(FormBuilder formBuilder) {
    String wildcardTooltip = getMessage(AbstractSearchParameters.WILDCARD_TOOLTIP_MSG_KEY);

    formBuilder.addProperty(searchParameters.getPolitischeGruppeProperty(politischeGruppeDao.findByWahlOrderByKurzname(getWahl())));

    formBuilder.addProperty(searchParameters.getWahlvorschlagsPersonTypProperty());

    formBuilder.addProperty(searchParameters.getPersonStatusProperty());
    formBuilder.addProperty(searchParameters.getFamiliennameProperty()).withTooltip(wildcardTooltip);
    formBuilder.addProperty(searchParameters.getVornameProperty()).withTooltip(wildcardTooltip);
  }

  @Override
  public boolean isBtnTeilnehmerEinladenRendered() {
    // Weitere Bedingungen in EL hinterlegt, cf. wahlvorschlags-person-search.xhtml!!!
    return true;
  }

  @Override
  public boolean isBtnTeilnehmerEinladenDisabled() {
    return isEmptySearchResultDisplayed();
  }

  @Override
  public boolean isBtnGoBackRendered() {
    return super.isBtnGoBackRendered() || isWahlvorschlagSelected() || isKandidaturSelected();
  }

  @Nullable
  @Override
  public String goBack() {
    wahlvorschlagConversationSelect.clearEntity();
    kandidaturConversationSelect.clearEntity();
    resetSearchResult();
    return super.goBack();
  }
}
