
package de.ivu.elect.presentation.benutzerverwaltung;

import java.util.List;

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

import de.ivu.elect.business.benutzerverwaltung.boundary.BenutzerEdit;
import de.ivu.elect.business.benutzerverwaltung.boundary.NachrichtEdit;
import de.ivu.elect.business.benutzerverwaltung.entity.Benutzer;
import de.ivu.elect.business.benutzerverwaltung.entity.Nachricht;
import de.ivu.elect.jee.entity.EagerLoadingCollector;
import de.ivu.elect.jee.faces.FacesContextUtil;
import de.ivu.elect.jee.presentation.dynamicform.FormBuilder;
import de.ivu.elect.jee.presentation.redirect.Redirect;
import de.ivu.elect.presentation.benutzerverwaltung.table.NachrichtColumnBuilder;
import de.ivu.elect.presentation.hilfe.OnlineHilfeId;
import de.ivu.elect.presentation.security.AbstractGebietSecurityFilter;

@OnlineHilfeId("497")
@Named(AbstractNachrichtSearchView.COMPONENT_NAME)
public class NachrichtSearchView extends AbstractNachrichtSearchView {

  private static final long serialVersionUID = 1L;

  @Inject
  private transient BenutzerEdit benutzerEdit;

  @Inject
  private transient NachrichtEdit nachrichtEdit;

  @Inject
  private transient NachrichtColumnBuilder nachrichtColumnBuilder;

  public NachrichtSearchView() {
    super();
  }

  @Override
  protected AbstractGebietSecurityFilter<Nachricht> getGebietSecurityFilter() {
    return KEIN_GEBIET_SECURITY_FILTER;
  }

  /**
   * @deprecated To be removed...
   * @see NachrichtSearchView#initSearchParametersByContext
   */
  @Deprecated
  @Override
  public void presetSearchParameters() {
    // To be removed...
  }

  @Override
  protected void initSearchParametersByContext() {
    super.initSearchParametersByContext();

    searchParameters.setLogin(getSelectedBenutzer());
    searchParameters.setBenutzerEinsatzort(getSelectedBenutzerEinsatzort());
  }

  @Override
  public void addProperties(FormBuilder formBuilder) {
    formBuilder.addProperty(searchParameters.getEmpfaengerGruppeArtProperty());
    formBuilder.addProperty(searchParameters.getEmpfaengerRolleFreitextProperty());

    formBuilder.addProperty(searchParameters.getZeitpunktVonDateProperty());
    formBuilder.addProperty(searchParameters.getZeitpunktVonTimeProperty());
    formBuilder.addProperty(searchParameters.getZeitpunktBisDateProperty());
    formBuilder.addProperty(searchParameters.getZeitpunktBisTimeProperty());
  }

  @Override
  public List<Nachricht> runSearch() {
    List<Nachricht> result = super.runSearch();

    updateLoginLetzteNachrichtId(result);

    return result;
  }

  private void updateLoginLetzteNachrichtId(List<Nachricht> result) {
    Benutzer benutzer = getSelectedBenutzer();

    if (benutzer != null) {
      Long letzteNachrichtId = benutzer.getLetzteNachrichtId();

      if (letzteNachrichtId == null) {
        letzteNachrichtId = 0L;
      }

      long searchResultMaxNachrichtId = result.stream().mapToLong(Nachricht::getId).max().orElse(0);

      benutzer.setLetzteNachrichtId(Math.max(letzteNachrichtId, searchResultMaxNachrichtId));

      benutzerEdit.save(benutzer);
    }
  }

  @Redirect
  public String delete() {
    nachrichtEdit.delete(getSearchResult());

    addInfoMessage("entity.edit.action.delete.success.message", entityMeta.getMehrzahlMessage());

    return FacesContextUtil.getCurrentViewId();
  }

  @Override
  public EagerLoadingCollector<Nachricht> getEagerLoadingCollector() {
    EagerLoadingCollector<Nachricht> eagerLoadingCollector = super.getEagerLoadingCollector();
    nachrichtColumnBuilder.collectEagerLoadings(eagerLoadingCollector);

    return eagerLoadingCollector;
  }
}
