package com.airlock.iam.admin.infrastructure.factory.prot;

import com.airlock.iam.admin.application.configuration.users.LockingSettings;
import com.airlock.iam.admin.application.service.user.AdminUserLockService;
import com.airlock.iam.admin.domain.model.user.AdminLockable;
import com.airlock.iam.admin.domain.model.user.UserSpecificSettings;
import com.airlock.iam.common.api.domain.model.store.user.UserStore;
import com.airlock.iam.common.domain.model.user.Lockable;
import com.airlock.iam.common.domain.service.adapt.PersistentUserAdapter;
import com.airlock.iam.common.domain.service.user.UserLockService;
import com.airlock.iam.common.domain.service.user.UserLockServiceImpl;
import com.airlock.iam.common.infrastructure.adapt.PersistentUserAdapterImpl;
import com.google.inject.PrivateModule;
import com.google.inject.Provides;
import com.google.inject.servlet.RequestScoped;
import jakarta.inject.Named;

public final class AdminUserLockServiceModule extends PrivateModule {
   @Provides
   PersistentUserAdapter<Lockable> provideAdapter() {
      return PersistentUserAdapterImpl.create(AdminLockable.class);
   }

   @Provides
   LockingSettings provideLockingSettings(UserSpecificSettings userSpecificSettings) {
      return userSpecificSettings.getLockingSettings();
   }

   @Provides
   UserStore provideUserStore(@Named("MANAGED_USERS_STORE") UserStore userStore) {
      return userStore;
   }

   protected void configure() {
      this.bind(UserLockService.class).to(UserLockServiceImpl.class).in(RequestScoped.class);
      this.expose(UserLockService.class);
      this.bind(AdminUserLockService.class).in(RequestScoped.class);
      this.expose(AdminUserLockService.class);
   }
}
