
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;


import static java.util.Objects.isNull;

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

  private static final long serialVersionUID = 1L;

  @Inject
  private BenutzerEdit benutzerEdit;

  @Inject
  private NachrichtEdit nachrichtEdit;

  @Inject
  private NachrichtColumnBuilder nachrichtColumnBuilder;

  public NachrichtSearchView() {
    super();
  }

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

    nachrichtColumnBuilder.collectEagerLoadings(eagerLoadingCollector);

    return eagerLoadingCollector;
  }

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

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

  private void updateLoginLetzteNachrichtId(List<Nachricht> result) {
    Benutzer login = getSelectedBenutzer();
    Long letzteNachrichtId = login.getLetzteNachrichtId();

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

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

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

    benutzerEdit.save(login);
  }

  @Override
  public void presetSearchParameters() {
    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());
  }

  @Redirect
  public String delete() {
    nachrichtEdit.delete(getSearchResult());
    addInfoMessage("entity.edit.action.delete.success.message", entityMeta.getMehrzahlMessage());
    return FacesContextUtil.getCurrentViewId();
  }
}
