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

import com.airlock.iam.apipolicyservice.infrastructure.credential.ApiPolicyServiceRequestAuthentication;
import com.airlock.iam.common.api.domain.model.credential.RequestAuthentication;
import com.airlock.iam.common.api.domain.service.credential.RequestAuthenticationService;
import com.airlock.iam.common.domain.model.user.TentativePrincipalInfo;
import com.airlock.iam.common.domain.service.credential.RequestAuthenticationLockService;
import com.airlock.iam.common.domain.service.credential.RequestAuthenticationServiceImpl;
import com.airlock.iam.common.domain.service.credential.RequestAuthenticationSettings;
import com.google.inject.PrivateModule;
import com.google.inject.Provides;
import com.google.inject.servlet.RequestScoped;
import java.util.Collections;
import java.util.Optional;
import java.util.OptionalInt;

public final class RequestAuthenticationServiceModule extends PrivateModule {
   @Provides
   RequestAuthenticationSettings provideRequestAuthenticationSettings() {
      return new RequestAuthenticationSettings(Optional.empty(), Collections.emptySet(), Collections.emptySet(), OptionalInt.empty());
   }

   @Provides
   RequestAuthenticationLockService provideRequestAuthenticationLockService() {
      throw new UnsupportedOperationException("Locking is not supported in Api Policy Service.");
   }

   @Provides
   @RequestScoped
   TentativePrincipalInfo provideTentativePrincipalInfo() {
      return new TentativePrincipalInfo();
   }

   protected void configure() {
      this.bind(RequestAuthentication.class).to(ApiPolicyServiceRequestAuthentication.class);
      this.bind(RequestAuthenticationService.class).to(RequestAuthenticationServiceImpl.class);
      this.expose(RequestAuthenticationService.class);
      this.expose(RequestAuthentication.class);
   }
}
