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

import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicLong;

import javax.ejb.Stateless;
import javax.enterprise.inject.Specializes;

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

import de.ivu.elect.business.benutzerverwaltung.entity.AbstractBenutzer;
import de.ivu.elect.business.benutzerverwaltung.entity.Benutzer;

@Stateless
@Specializes
public class NlDatabaseLoginServiceEJB extends DatabaseLoginServiceEJB {

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

  private static final AtomicLong LETZTER_VERSUCH_ADMIN = new AtomicLong();

  private static final long FIVE_MINUTES_IN_MS = TimeUnit.MINUTES.toMillis(5);

  @Override
  protected boolean isBenutzerGesperrt(Benutzer benutzer) {
    if (benutzer.isAdmin()) {
      return sonderbehandlungAdmin(benutzer);
    }
    return super.isBenutzerGesperrt(benutzer);
  }

  /*
   * ELECTVAPP-358
   */
  private boolean sonderbehandlungAdmin(Benutzer benutzer) {
    if (benutzer.getLoginVersuche() >= AbstractBenutzer.ACCOUNT_GESPERRT_AB_LOGIN_VERSUCHE) {
      long differenz = (LETZTER_VERSUCH_ADMIN.get() + FIVE_MINUTES_IN_MS) - System.currentTimeMillis();
      if (differenz > 0) {
        LOG.warn("Admin noch gesperrt: " + differenz);
        return true;
      }
    }
    LETZTER_VERSUCH_ADMIN.set(System.currentTimeMillis());
    return false;
  }
}
