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

import javax.inject.Inject;

import de.ivu.elect.jee.security.AuthentificationFailedException;
import de.ivu.elect.jee.security.LoginData;
import de.ivu.elect.jee.security.LoginService;
import de.ivu.elect.jee.security.LoginServiceContext;
import de.ivu.elect.jee.security.LoginServiceFactory;

public abstract class AbstractExternalLoginService implements LoginService {

  @Inject
  private transient DatabaseLoginService databaseLoginService;

  @Inject
  private transient LoginServiceKonfiguration loginServiceKonfiguration;

  @Override
  public LoginData login(LoginServiceContext context, Long mandantenNummer, String benutzername, String kennungImKlartext) throws AuthentificationFailedException {
    // Ausnahme: "admin" immer über die DB authentifizieren
    if (LoginServiceFactory.isAdminKennung(benutzername)) {
      return databaseLoginService.login(context, mandantenNummer, benutzername, kennungImKlartext);
    }

    return loginExternal(mandantenNummer, benutzername, kennungImKlartext);

  }

  protected abstract LoginData loginExternal(Long mandantenNummer, String benutzername, String kennungImKlartext)
      throws AuthentificationFailedException;

  @Override
  public void changePassword(LoginServiceContext context, Long mandantenNummer, String benutzerkennung, String passwortAlt, String passwortNeu) {
    if (LoginServiceFactory.isAdminKennung(benutzerkennung)) {
      databaseLoginService.changePassword(context, mandantenNummer, benutzerkennung, passwortAlt, passwortNeu);
    } else {
      changePasswordExternal(mandantenNummer, benutzerkennung, passwortAlt, passwortNeu);
    }
  }

  protected abstract void changePasswordExternal(Long mandantenNummer, String benutzerkennung, String passwortAlt, String passwortNeu);

  @Override
  public String getPasswortFormatPattern(Long mandantenNummer) {
    return loginServiceKonfiguration.getLoginServicePasswortFormatPattern(mandantenNummer);
  }

  @Override
  public String getPasswortFormatBeschreibung(Long mandantenNummer) {
    return loginServiceKonfiguration.getLoginServicePasswortFormatBeschreibung(mandantenNummer);
  }

  @Override
  public boolean isBenutzerAnlegenMoeglich(Long mandantenNummer) {
    // Anlegen von Nutzern bei externen Systemen nicht möglich
    return false;
  }

  @Override
  public boolean isSperrenMoeglich(Long mandantenNummer) {
    // Sperren von Nutzern bei externen Systemen nicht möglich
    return false;
  }

  @Override
  public boolean isBenutzernameKannGewechseltWerden(Long mandantenNummer) {
    // Wehchseln der Benutzerkennung bei externen Systemen nicht möglich
    return false;
  }
}
