
package de.ivu.elect.presentation.security;

import javax.annotation.PostConstruct;
import javax.enterprise.context.RequestScoped;
import javax.inject.Inject;
import javax.inject.Named;

import org.apache.commons.lang3.StringUtils;
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.jee.faces.Escape;
import de.ivu.elect.jee.faces.FacesContextUtil;
import de.ivu.elect.jee.faces.Messages;
import de.ivu.elect.jee.presentation.redirect.Redirect;
import de.ivu.elect.jee.presentation.security.StartViewResolver;
import de.ivu.elect.jee.security.AuthentificationFailedException;
import de.ivu.elect.presentation.LayoutComponentsContext;
import de.ivu.elect.presentation.View;
import de.ivu.elect.presentation.hilfe.KeineOnlineHilfe;
import de.ivu.elect.presentation.hilfe.OnlineHilfeId;

@Named
@RequestScoped
@OnlineHilfeId(KeineOnlineHilfe.KEINE_ONLINE_HILFE)
@View(viewId = LoginView.VIEW_ID, useCase = UseCasePermission.OHNE)
public class LoginView {

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

  public static final String VIEW_ID = "/login.xhtml";

  @Inject
  protected transient Escape escape;

  @Inject
  protected transient Messages messages;

  @Inject
  protected transient LoginParameter loginParameter;

  @Inject
  protected transient ElectCommonPrincipal principal;

  @Inject
  protected transient StartViewResolver startViewResolver;

  @Inject
  protected transient LoginGewuenschteSeite loginGewuenschteSeite;

  @Inject
  protected transient LayoutComponentsContext layoutComponentsContext;

  @Inject
  protected transient ChangePasswordParameter changePasswordParameter;

  @Inject
  protected LoginViewMandantStore loginViewMandantStore;

  public LoginView() {
    super();
  }

  @PostConstruct
  public void init() {
    loginViewMandantStore.checkUrlParameter();
  }

  @Redirect
  public String login() {
    String benutzerkennung = loginParameter.getBenutzerkennung();
    // ELECTVAPP-1808
    if (StringUtils.isNotBlank(benutzerkennung) && (benutzerkennung.indexOf('\n') >= 0 || benutzerkennung.indexOf('\r') >= 0)) {
      LOG.warn("Line break in username - ignore");
      return LoginView.VIEW_ID;
    }
    String passwort = loginParameter.getPasswort();

    try {
      login(benutzerkennung, passwort);

      if (principal.isLoggedIn()) {
        if (principal.isMustChangePassword()) {
          // ELECT-8340
          changePasswordParameter.setAfterLogin(passwort);
          return ChangePasswordView.VIEW_ID;
        }

        return getStartViewId();
      }
    } catch (AuthentificationFailedException ex) {
      messages.addErrorMessage(ex.getMessageKey(), ex.getObjects());
      LOG.warn("Fehler beim Anmelden, Benutzer: " + escape.encodeUrl(benutzerkennung) + ", Meldung: " + ex.getMessage());
    } catch (Exception exception) {
      LOG.error("Fehler beim Anmelden, Benutzer: " + escape.encodeUrl(benutzerkennung) + ", Meldung: " + exception.getMessage(), exception);
      messages.addErrorMessage("login.action.login.error.unknown", exception.getMessage());
    }

    return LoginView.VIEW_ID;
  }

  protected void login(String benutzerkennung, String passwort) {
    principal.loginMandant(loginViewMandantStore.getNummerFuerLogin(), benutzerkennung, passwort);
  }

  private String getStartViewId() {
    if (principal.getMandant().getArt().isCustomerMandant()) {
      layoutComponentsContext.checkEntitySelected();
    }
    return loginGewuenschteSeite.getStartViewId();
  }

  public void checkLoggedInAlready() {
    if (principal.isLoggedIn()) {
      String startViewId = startViewResolver.getStartViewId();
      LOG.info("Nutzer bereits eingeloggt: " + principal.getLogin().getBenutzerkennung() + ", redirect zu StartView: " + startViewId);
      FacesContextUtil.redirectToView(startViewId);
    }
  }

}
