
package de.ivu.elect.presentation;

import java.io.Serializable;

import javax.annotation.Nonnull;
import javax.inject.Inject;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import de.ivu.elect.business.security.UseCasePermission;
import de.ivu.elect.business.security.control.ElectCommonPrincipal;
import de.ivu.elect.presentation.benutzerverwaltung.BenutzerSearchView;
import de.ivu.elect.presentation.dashboard.DashboardView;
import de.ivu.elect.presentation.konfiguration.KonfigurationSearchView;
import de.ivu.elect.presentation.konfiguration.menu.KonfigurationUngueltigSearchMenuItemEntry;
import de.ivu.elect.presentation.mandant.MandantSearchView;
import de.ivu.elect.presentation.security.sso.SingleSignOnView;
import de.ivu.elect.presentation.system.menu.SystemGebietsebeneEditMenuItem;
import de.ivu.elect.presentation.system.menu.SystemLogUnbestaetigtSearchMenuItemEntry;
import de.ivu.elect.presentation.wahl.WahlterminSearchView;


import static org.apache.commons.lang3.StringUtils.isNotBlank;

public class ElectBaseStartViewResolver implements Serializable {

  private static final Logger LOG = LoggerFactory.getLogger(ElectBaseStartViewResolver.class);

  private static final long serialVersionUID = 1L;

  @Inject
  protected transient ElectCommonPrincipal principal;

  @Inject
  protected transient SystemLogUnbestaetigtSearchMenuItemEntry systemLogUnbestaetigtSearchMenuItemEntry;

  @Inject
  protected transient KonfigurationUngueltigSearchMenuItemEntry konfigurationUngueltigSearchMenuItemEntry;

  @Inject
  private transient SystemGebietsebeneEditMenuItem systemGebietsebeneEditMenuItem;

  public ElectBaseStartViewResolver() {
    super();
  }

  public String getStartViewIdAfterLogin() {
    // ELECTKOM-202 bis es mal einen schönen Setup-Wizard beim Erstlogin gibt...
    // ... hier die Version für Arme...wenn kein Dashboard vorhanden ist
    if (!isDashboardInitalAnzeigen() && isBenutzerDarfKonfigurationSuchen()) {
      if (konfigurationUngueltigSearchMenuItemEntry.isPossible()) {
        return konfigurationUngueltigSearchMenuItemEntry.doAction();
      }
    }

    return getStartViewId();
  }

  public String getStartViewId() {
    if (principal.getMandant() != null && !principal.getMandant().getSystemGebietsebene().isGesetzt()) {
      if (systemGebietsebeneEditMenuItem.isPossible()) {
        return systemGebietsebeneEditMenuItem.getTargetViewId();
      }
    }

    if (isDashboardInitalAnzeigen()) {
      return DashboardView.VIEW_ID;
    }

    if (hasPermission(UseCasePermission.SYSTEM_LOG_SEARCH) && systemLogUnbestaetigtSearchMenuItemEntry.isPossible()) {
      return systemLogUnbestaetigtSearchMenuItemEntry.getTargetViewId();
    }

    return getStartViewIdInternal();
  }

  protected boolean isDashboardInitalAnzeigen() {
    return isBenutzerDarfDashboardAnzeigen();
  }

  protected String getStartViewIdInternal() {
    return getElectStartViewId();
  }

  @Nonnull
  protected String getElectStartViewId() {
    if (isBenutzerDarfWahltermineSuchen()) {
      return WahlterminSearchView.VIEW_ID;
    }

    if (isBenutzerDarfMandantenSuchen()) {
      return MandantSearchView.VIEW_ID;
    }

    if (isBenutzerDarfBenutzerSuchen()) {
      return BenutzerSearchView.VIEW_ID;
    }

    if (isBenutzerDarfKonfigurationSuchen()) {
      return KonfigurationSearchView.VIEW_ID;
    }

    if (hasPermission(UseCasePermission.ANWENDUNG_BENUTZEN)) {
      return BlankView.VIEW_ID;
    }

    if (isNotBlank(principal.getName())) {
      LOG.info("Keine Rechte vorhanden: " + principal.getName() + " logout");
    }

    principal.logout(); // TODO  Unklar wieso ausloggen, wahrscheinlich, weil der Nutzer nichts darf...

    return SingleSignOnView.VIEW_ID;
  }

  protected boolean isBenutzerDarfDashboardAnzeigen() {
    return hasPermission(UseCasePermission.DASHBOARD_ANZEIGEN);
  }

  protected boolean isBenutzerDarfMandantenSuchen() {
    return hasPermission(UseCasePermission.MANDANT_SEARCH);
  }

  protected boolean isBenutzerDarfBenutzerSuchen() {
    return hasPermission(UseCasePermission.BENUTZER_SEARCH);
  }

  protected boolean isBenutzerDarfKonfigurationSuchen() {
    return hasPermission(UseCasePermission.KONFIGURATION_SEARCH);
  }

  protected boolean isBenutzerDarfWahlenSuchen() {
    return hasPermission(UseCasePermission.WAHL_SEARCH);
  }

  protected boolean isBenutzerDarfWahltermineSuchen() {
    return hasPermission(UseCasePermission.WAHLTERMIN_SEARCH);
  }

  protected boolean hasPermission(UseCasePermission useCasePermission) {
    return principal.hasUseCasePermission(useCasePermission);
  }
}
