
package de.ivu.elect.presentation.benutzerverwaltung.menu;

import java.util.Collections;
import java.util.List;

import javax.inject.Inject;

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

import de.ivu.elect.business.benutzerverwaltung.boundary.AbstractNachrichtSearchParameters;
import de.ivu.elect.business.benutzerverwaltung.boundary.NachrichtSearch;
import de.ivu.elect.business.benutzerverwaltung.boundary.NachrichtSearchParameters;
import de.ivu.elect.business.benutzerverwaltung.entity.Benutzer;
import de.ivu.elect.business.security.UseCasePermission;
import de.ivu.elect.business.security.control.ElectCommonPrincipal;
import de.ivu.elect.presentation.benutzerverwaltung.NachrichtCreateView;
import de.ivu.elect.presentation.menu.BadgeCounterMainMenuItemEntry;

public class NachrichtMainMenuEntry extends AbstractNachrichtMenuItemEntry implements BadgeCounterMainMenuItemEntry {

  private static final long serialVersionUID = 1L;

  // Cf. /elect-common-war/src/main/webapp/resources/css/common/Icons.css.
  private static final String ICON_BADGE_COUNTER_NAME = "ui-icon-badge-counter-nachricht";

  @Inject
  private transient NachrichtSearch nachrichtSearch;

  @Inject
  @ConversationGroup(AbstractNachrichtSearchParameters.class)
  private transient NachrichtSearchParameters nachrichtSearchParameters;

  @Inject
  private transient NachrichtMenuItemEntry nachrichtMenuItemEntry;

  private long nachrichtenUngelesenCount;

  public NachrichtMainMenuEntry() {
    super();

    this.nachrichtenUngelesenCount = -1;
  }

  @Override
  protected UseCasePermission getUseCasePermission() {
    return nachrichtMenuItemEntry.getUseCasePermission();
  }

  @Override
  public boolean isRendered() {
    return isRenderedCountIgnored() && getCount() > 0;
  }

  @Override
  public boolean isRenderedCountIgnored() {
    return nachrichtMenuItemEntry.isRendered();
  }

  @Override
  public boolean isDisabledInternal() {
    return nachrichtMenuItemEntry.isDisabledInternal();
  }

  @Override
  public String getTargetViewId() {
    ElectCommonPrincipal principal = getPrincipal();

    nachrichtSearchParameters.reset();

    if (principal != null) {
      nachrichtSearchParameters.setBenutzerEinsatzort(principal.getBenutzerEinsatzort());

      Benutzer benutzer = principal.getLogin();

      if (benutzer != null) {
        nachrichtSearchParameters.setLogin(benutzer);
        nachrichtSearchParameters.setLetzteId(benutzer.getLetzteNachrichtId());
      }
    }

    return nachrichtMenuItemEntry.getTargetViewId();
  }

  @Override
  protected List<String> getAdditionalTopicViewIds() {
    return Collections.singletonList(NachrichtCreateView.VIEW_ID);
  }

  private long getCount() {
    if (nachrichtenUngelesenCount < 0) {
      if (isRenderedCountIgnored()) {
        ElectCommonPrincipal principal = getPrincipal();

        if (principal != null) {
          nachrichtenUngelesenCount = nachrichtSearch.countNachrichtenUngelesen(principal.getLogin(), principal.getBenutzerEinsatzort());

          if (nachrichtenUngelesenCount > 0) {
            addInfoMessage("nachricht.vorhanden.hint", nachrichtenUngelesenCount);
          }
        }
      } else {
        nachrichtenUngelesenCount = 0;
      }
    }

    return nachrichtenUngelesenCount;
  }

  @Override
  public String getTitle() {
    return nachrichtMenuItemEntry.getLabelFinal();
  }

  @Override
  protected String getLabel() {
    // NOTE, dass nur das Icon angezeigt werden soll!
    return "";
  }

  @Override
  public String getLabelKey() {
    return nachrichtMenuItemEntry.getLabelKey();
  }

  @Override
  public String getIcon() {
    return nachrichtMenuItemEntry.getIcon();
  }

  @Override
  public String getStyleClass() {
    return super.getStyleClass() + " ui-icon-badge " + ICON_BADGE_COUNTER_NAME;
  }

  @Override
  public String getStyle() {
    return super.getStyle() + " counter-reset: " + ICON_BADGE_COUNTER_NAME + " " + Math.min(getCount(), 99) + ";";
  }
}
