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

import com.airlock.iam.common.api.domain.model.user.User;
import com.airlock.iam.common.api.domain.model.user.UsernameToPropagate;
import com.airlock.iam.common.application.configuration.templock.TemporaryLockingConfig;
import com.airlock.iam.common.application.service.DefaultSessionTerminationService;
import com.airlock.iam.common.application.service.session.SessionTerminationService;
import com.airlock.iam.common.domain.model.user.NonExistentUser;
import com.airlock.iam.common.infrastructure.delay.ResponseDelayCondition;
import com.airlock.iam.core.misc.authorization.AccessController;
import com.airlock.iam.flow.infrastructure.mapper.DefaultFlowResponseTransformer;
import com.airlock.iam.flow.infrastructure.transfer.response.FlowResponseTransformer;
import com.airlock.iam.flow.shared.domain.service.MetadataProvider;
import com.airlock.iam.flow.shared.infrastructure.service.FailureResponseDelayCondition;
import com.airlock.iam.flow.shared.infrastructure.service.NoMetadataProvider;
import com.google.inject.PrivateModule;
import com.google.inject.TypeLiteral;
import com.google.inject.servlet.RequestScoped;
import java.util.Optional;

public final class TechClientRegInfrastructureModule extends PrivateModule {
   protected void configure() {
      this.bind(ResponseDelayCondition.class).to(FailureResponseDelayCondition.class).in(RequestScoped.class);
      this.expose(ResponseDelayCondition.class);
      this.bind(FlowResponseTransformer.class).to(DefaultFlowResponseTransformer.class);
      this.expose(FlowResponseTransformer.class);
      this.bind(SessionTerminationService.class).to(DefaultSessionTerminationService.class);
      this.expose(SessionTerminationService.class);
      this.bind(new TypeLiteral<Optional<AccessController>>() {}).toInstance(Optional.empty());
      this.expose(new TypeLiteral<Optional<AccessController>>() {});
      this.bind(new TypeLiteral<Optional<TemporaryLockingConfig>>() {}).toInstance(Optional.empty());
      this.expose(new TypeLiteral<Optional<TemporaryLockingConfig>>() {});
      this.bind(MetadataProvider.class).toInstance(new NoMetadataProvider());
      this.expose(MetadataProvider.class);
      this.bind(User.class).toInstance(new NonExistentUser());
      this.expose(User.class);
      this.bind(new TypeLiteral<Optional<UsernameToPropagate>>() {}).toInstance(Optional.empty());
      this.expose(new TypeLiteral<Optional<UsernameToPropagate>>() {});
   }
}
