
package de.ivu.elect.business.security.control;

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

import de.ivu.elect.business.benutzerverwaltung.entity.Benutzer;
import de.ivu.elect.business.benutzerverwaltung.entity.BenutzerEinsatzort;
import de.ivu.elect.business.benutzerverwaltung.entity.BenutzerParameter;
import de.ivu.elect.business.mandant.entity.Mandant;
import de.ivu.elect.business.security.UseCasePermission;
import de.ivu.elect.business.security.entity.ElectPricipalContext;
import de.ivu.elect.business.security.entity.TfaStatus;
import de.ivu.elect.jee.security.LoginData;
import de.ivu.elect.jee.security.LoginGruppe;
import de.ivu.elect.jee.security.LoginServiceContext;

public class StatelessElectCommonPrincipal extends AbstractElectCommonPrincipal {

  private static final long serialVersionUID = 1L;

  private final StatelessElectPricipalContext statelessElectPricipalContext;

  private List<String> rollenNamen;

  private Collection<UseCasePermission> useCasePermissions;

  private LoginData loginData;

  private final LoginServiceContext internalContext;

  public StatelessElectCommonPrincipal(StatelessElectPricipalContext statelessElectPricipalContext, LoginServiceContext internalContext) {
    this(statelessElectPricipalContext, internalContext, Collections.emptyList(), Collections.emptyList());
  }

  public StatelessElectCommonPrincipal(StatelessElectPricipalContext statelessElectPricipalContext, LoginServiceContext internalContext,
                                       List<String> rollenNamen, Collection<UseCasePermission> useCasePermissions) {
    super();

    this.statelessElectPricipalContext = statelessElectPricipalContext;
    this.internalContext = internalContext;
    this.rollenNamen = rollenNamen;
    this.useCasePermissions = useCasePermissions;
  }

  @Override
  public ElectPricipalContext getPrincipalContext() {
    return statelessElectPricipalContext;
  }

  @Override
  protected void handleHttpSession() {
    // nichts zu tun, keine http Session vorhanden
  }

  @Override
  public void login(LoginData loginData) {
    super.login(loginData);
    this.loginData = loginData;
  }



  @Override
  protected Collection<UseCasePermission> bestimmePermissions(Benutzer login, BenutzerEinsatzort benutzerEinsatzort) {
    if (useCasePermissions==null || useCasePermissions.isEmpty()) {
      useCasePermissions = super.bestimmePermissions(login, benutzerEinsatzort);
    }
    return useCasePermissions;
  }

  @Override
  protected List<String> bestimmeRollennamen(Benutzer login, BenutzerEinsatzort benutzerEinsatzort) {
    if (rollenNamen==null || rollenNamen.isEmpty()) {
      rollenNamen = super.bestimmeRollennamen(login, benutzerEinsatzort);
    }
    return rollenNamen;
  }

  @Override
  protected void updateGruppen(Benutzer benutzer, List<LoginGruppe> loginGruppen) {
    // nichts zu tun, sind schon da
  }

  @Override
  protected TfaStatus bestimmeTfaStatus(Mandant mandant, Collection<UseCasePermission> result) {
    return TfaStatus.DEAKTIVIERT;
  }

  @Override
  protected void bestimmeBenutzerEinsatzort(Mandant mandant) {
    // nichts zu tun, unwichtig
  }

  @Override
  protected void loggeRollen(Benutzer login, BenutzerEinsatzort benutzerEinsatzort) {
    // nichts zu tun, unwichtig
  }

  @Override
  protected void uebernehmeEinstellungen(Collection<BenutzerParameter> benutzerParameterList) {
    // nichts zu tun, unwichtig
  }

  @Override
  protected void updateLastLoginTime(Benutzer benutzer) {
    // nichts zu tun, unwichtig
  }

  @Override
  public void flush() {
    // nichts zu tun, unwichtig
  }

  @Override
  protected void fireLoginChangeEvent(Benutzer login) {
    // nichts zu tun, unwichtig
  }

  public LoginData getLoginDataForCache() {
    return loginData;
  }

  public List<String> getRollenNamenForCache() {
    return rollenNamen;
  }

  public Collection<UseCasePermission> getUseCasePermissionsForCache() {
    return useCasePermissions;
  }

  @Override
  protected LoginServiceContext getLoginContext() {
    return internalContext;
  }

  @Override
  protected boolean isGesperrt(Benutzer login) {
    if (!Boolean.TRUE.equals(getLoginContext().get(DatabaseLoginServiceEJB.IGNORIERE_GESPERRT_KEY, Boolean.class))) {
      return super.isGesperrt(login);
    }
    return false;
  }
}
