package com.airlock.iam.apipolicyservice.app.infrastructure.factory;

import com.airlock.iam.apipolicyservice.application.configuration.ApiPolicyServiceAppConfig;
import com.airlock.iam.common.domain.model.session.IamSession;
import com.airlock.iam.common.domain.model.session.ReadOnlyIamSessionData;
import com.airlock.iam.common.domain.model.session.SessionTimeoutSettings;
import com.airlock.iam.common.domain.service.SessionService;
import com.airlock.iam.common.domain.service.session.IamSessionService;
import com.airlock.iam.common.infrastructure.session.SessionServiceImpl;
import com.google.inject.Exposed;
import com.google.inject.PrivateModule;
import com.google.inject.Provides;
import com.google.inject.TypeLiteral;
import com.google.inject.servlet.RequestScoped;
import java.time.Duration;
import java.util.Optional;

public class ApiPolicyServiceInfrastructureModule extends PrivateModule {
   @Provides
   @RequestScoped
   @Exposed
   SessionTimeoutSettings provideSessionTimeoutSettings(ApiPolicyServiceAppConfig apiPolicyAppConfig) {
      return new SessionTimeoutSettings(Duration.ofSeconds(1L), Optional.empty());
   }

   protected void configure() {
      this.bind(new TypeLiteral<IamSessionService<?>>() {}).toInstance(new ApiPolicyServiceInfrastructureModule.NoIamSessionService());
      this.expose(new TypeLiteral<IamSessionService<?>>() {});
      this.bind(SessionService.class).to(SessionServiceImpl.class);
      this.expose(SessionService.class);
   }

   private static final class NoIamSessionService implements IamSessionService<IamSession> {
      public IamSession retrieveOrCreateSession() {
         throw new UnsupportedOperationException();
      }

      public Optional<ReadOnlyIamSessionData> retrieveReadOnlySessionData() {
         throw new UnsupportedOperationException();
      }

      public void updateSession(IamSession session) {
         throw new UnsupportedOperationException();
      }

      public void removeSession(IamSession session) {
         throw new UnsupportedOperationException();
      }

      public void renewSessionNonce(IamSession session) {
         throw new UnsupportedOperationException();
      }
   }
}
