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

import javax.enterprise.event.Event;
import javax.inject.Inject;

import de.ivu.elect.business.CurrentCustomer;
import de.ivu.elect.business.benutzerverwaltung.boundary.AbstractBenutzerDAO;
import de.ivu.elect.business.benutzerverwaltung.boundary.AbstractBenutzerEinsatzortDAO;
import de.ivu.elect.business.benutzerverwaltung.boundary.AbstractRolleDAO;
import de.ivu.elect.business.benutzerverwaltung.boundary.BenutzerEinsatzortExtendedDAO;
import de.ivu.elect.business.benutzerverwaltung.boundary.BenutzerExtendedDAO;
import de.ivu.elect.business.benutzerverwaltung.boundary.RolleExtendedDAO;
import de.ivu.elect.business.benutzerverwaltung.control.AbstractBenutzerEinsatzortBestimmer;
import de.ivu.elect.business.benutzerverwaltung.control.BenutzerEinsatzortBestimmer;
import de.ivu.elect.business.konfiguration.entity.AbstractKonfigurationLoader;
import de.ivu.elect.business.konfiguration.entity.KonfigurationNewTransaktionLoader;
import de.ivu.elect.business.mandant.boundary.AbstractMandantDAO;
import de.ivu.elect.business.mandant.boundary.MandantExtendedDAO;
import de.ivu.elect.business.system.control.SystemStatusPermissions;
import de.ivu.elect.jee.faces.Messages;
import de.ivu.elect.jee.security.LoginChangeEvent;
import de.ivu.elect.jee.security.LoginIpBestimmer;
import de.ivu.elect.jee.security.LoginServiceFactory;
import de.ivu.elect.jee.security.LogoutChangeEvent;
import de.ivu.elect.presentation.security.MandantenNummerUrlParameter;
import de.ivu.elect.presentation.security.PrincipalNameFormatter;

public class ExtendedElectPricipalContext extends AbstractElectPricipalContext {

  private static final long serialVersionUID = 1L;

  @Inject
  private transient LoginServiceFactory loginServiceFactory;

  @Inject
  private transient LoginIpBestimmer loginIpBestimmer;

  @Inject
  private transient Event<LoginChangeEvent> loginChangeEvent;

  @Inject
  private transient Event<LogoutChangeEvent> logoutChangeEvent;

  @Inject
  private transient Messages messages;

  @Inject
  private transient BenutzerExtendedDAO benutzerDao;

  @Inject
  private transient RolleExtendedDAO rolleDao;

  @Inject
  private transient BenutzerEinsatzortExtendedDAO benutzerEinsatzortExtendedDAO;

  @Inject
  private transient PrincipalBenutzerCreator principalBenutzerCreator;

  @Inject
  private transient PrincipalNameFormatter principalNameFormatter;

  @Inject
  private transient KonfigurationNewTransaktionLoader konfigurationLoader;

  @Inject
  private transient BenutzerEinsatzortBestimmer benutzerEinsatzortBestimmer;

  @Inject
  private transient SystemStatusPermissions systemStatusPermissions;

  @Inject
  private transient MandantExtendedDAO mandantExtendedDAO;

  @Inject
  private transient MandantenNummerUrlParameter mandantenNummerUrlParameter;

  @Inject
  private transient TfaPrincipalStatus tfaPrincipalStatus;

  @Inject
  private transient CurrentCustomer currentCustomer;

  @Inject
  private transient ElectExtendedUseCasePermissionFilter extendedElectUseCasePermissionFilter;

  @Override
  public AbstractMandantDAO getMandantDao() {
    return mandantExtendedDAO;
  }

  @Override
  public AbstractBenutzerDAO getBenutzerDao() {
    return benutzerDao;
  }

  @Override
  public AbstractRolleDAO getRolleDao() {
    return rolleDao;
  }

  @Override
  public AbstractBenutzerEinsatzortDAO getBenutzerEinsatzortDAO() {
    return benutzerEinsatzortExtendedDAO;
  }

  @Override
  public PrincipalBenutzerCreator getPrincipalBenutzerCreator() {
    return principalBenutzerCreator;
  }

  @Override
  public PrincipalNameFormatter getPrincipalNameFormatter() {
    return principalNameFormatter;
  }

  @Override
  public AbstractKonfigurationLoader getKonfigurationLoader() {
    return konfigurationLoader;
  }

  @Override
  public AbstractBenutzerEinsatzortBestimmer getBenutzerEinsatzortBestimmer() {
    return benutzerEinsatzortBestimmer;
  }

  @Override
  public SystemStatusPermissions getSystemStatusPermissions() {
    return systemStatusPermissions;
  }

  @Override
  public void setzeLoginMandant(Long mandantenNummer) {
    if (mandantenNummer == null) {
      // nicht zu tun
    } else {
      mandantenNummerUrlParameter.setMandantenNummer(mandantenNummer);
    }
  }

  @Override
  public LoginServiceFactory getLoginServiceFactory() {
    return loginServiceFactory;
  }

  @Override
  public LoginIpBestimmer getLoginIpBestimmer() {
    return loginIpBestimmer;
  }

  @Override
  public Event<LoginChangeEvent> getLoginChangeEvent() {
    return loginChangeEvent;
  }

  @Override
  public Event<LogoutChangeEvent> getLogoutChangeEvent() {
    return logoutChangeEvent;
  }

  @Override
  public Messages getMessages() {
    return messages;
  }

  @Override
  public ElectExtendedUseCasePermissionFilter getUseCasePermissionFilter() {
    return extendedElectUseCasePermissionFilter;
  }

  @Override
  public TfaPrincipalStatus getTfaPrincipalStatus() {
    return tfaPrincipalStatus;
  }

  @Override
  public CurrentCustomer getCurrentCustomer() {
    return currentCustomer;
  }
}
