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

import java.lang.annotation.Annotation;

import javax.enterprise.event.Event;
import javax.enterprise.util.TypeLiteral;
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.BenutzerDAO;
import de.ivu.elect.business.benutzerverwaltung.boundary.BenutzerEinsatzortDAO;
import de.ivu.elect.business.benutzerverwaltung.boundary.RolleDAO;
import de.ivu.elect.business.benutzerverwaltung.control.AbstractBenutzerEinsatzortBestimmer;
import de.ivu.elect.business.benutzerverwaltung.control.StatelessBenutzerEinsatzortBestimmer;
import de.ivu.elect.business.benutzerverwaltung.entity.BenutzerPK;
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.MandantDAO;
import de.ivu.elect.business.security.UseCasePermission;
import de.ivu.elect.business.system.control.SystemStatusPermissions;
import de.ivu.elect.jee.faces.Messages;
import de.ivu.elect.jee.security.IpHostname;
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.jee.security.UseCasePermissionFilter;
import de.ivu.elect.presentation.security.PrincipalNameFormatter;

public class StatelessElectPricipalContext extends AbstractElectPricipalContext  {

  private static final long serialVersionUID = 1L;

  @Inject
  private transient BenutzerDAO benutzerDao;

  @Inject
  private transient RolleDAO rolleDao;

  @Inject
  private transient BenutzerEinsatzortDAO benutzerEinsatzortDAO;

  @Inject
  private transient PrincipalBenutzerCreator principalBenutzerCreator;

  @Inject
  private transient PrincipalNameFormatter principalNameFormatter;

  @Inject
  private transient KonfigurationNewTransaktionLoader konfigurationLoader;

  @Inject
  private transient StatelessBenutzerEinsatzortBestimmer benutzerEinsatzortBestimmer;

  @Inject
  private transient SystemStatusPermissions systemStatusPermissions;

  @Inject
  private transient LoginServiceFactory loginServiceFactory;

  @Inject
  private transient Messages messages;

  @Inject
  private transient MandantDAO mandantDao;

  @Inject
  private transient TfaPrincipalStatus tfaPrincipalStatus;

  @Inject
  private transient CurrentCustomer currentCustomer;

  @Inject
  private transient ElectUseCasePermissionFilter electUseCasePermissionFilter;

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

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

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

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

  @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) {
    // nichts zu tun
  }

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

  @Override
  public LoginIpBestimmer getLoginIpBestimmer() {
    return new LoginIpBestimmer() {
      private static final long serialVersionUID = 1L;
      @Override
      public IpHostname bestimmeIpAdresseAusRequest() {
        return IpHostname.UNBEKANNT;
      }
    };
  }

  @Override
  public Event<LoginChangeEvent> getLoginChangeEvent() {
    return new Event<LoginChangeEvent>() {
      @Override
      public void fire(LoginChangeEvent event) {
        // nichts zu tun
      }

      @Override
      public Event<LoginChangeEvent> select(Annotation... qualifiers) {
        throw new UnsupportedOperationException();
      }

      @Override
      public <U extends LoginChangeEvent> Event<U> select(Class<U> subtype, Annotation... qualifiers) {
        throw new UnsupportedOperationException();
      }

      @Override
      public <U extends LoginChangeEvent> Event<U> select(TypeLiteral<U> subtype, Annotation... qualifiers) {
        throw new UnsupportedOperationException();
      }
    };
  }

  @Override
  public Event<LogoutChangeEvent> getLogoutChangeEvent() {
    return new Event<LogoutChangeEvent>() {
      @Override
      public void fire(LogoutChangeEvent event) {
        // nichts zu tun
      }

      @Override
      public Event<LogoutChangeEvent> select(Annotation... qualifiers) {
        throw new UnsupportedOperationException();
      }

      @Override
      public <U extends LogoutChangeEvent> Event<U> select(Class<U> subtype, Annotation... qualifiers) {
        throw new UnsupportedOperationException();
      }

      @Override
      public <U extends LogoutChangeEvent> Event<U> select(TypeLiteral<U> subtype, Annotation... qualifiers) {
        throw new UnsupportedOperationException();
      }
    };
  }

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

  @Override
  public ElectUseCasePermissionFilter getUseCasePermissionFilter() {
    return electUseCasePermissionFilter;
  }

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

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