package com.airlock.iam.publicselfservice.infrastructure.factory.shared;

import com.airlock.iam.base.api.infrastructure.plugin.ModuleForConfig;
import com.airlock.iam.common.api.domain.model.authmethod.AuthenticationMethod;
import com.airlock.iam.common.domain.model.principal.UserPrincipal;
import com.airlock.iam.common.domain.model.user.Lockable;
import com.airlock.iam.core.misc.impl.authen.AuthenticationMethodFactory;
import com.airlock.iam.log.api.signing.SigningLogger;
import com.airlock.iam.publicselfservice.application.configuration.flow.PublicSelfServiceSettings;
import com.airlock.iam.publicselfservice.application.configuration.steps.PublicSelfServiceUnlockUserStepConfig;
import com.airlock.iam.publicselfservice.domain.model.user.PublicSelfServiceLockable;
import com.google.inject.Exposed;
import com.google.inject.PrivateModule;
import com.google.inject.Provides;
import java.util.List;

@ModuleForConfig(PublicSelfServiceUnlockUserStepConfig.class)
public class PublicSelfServiceUnlockUserStepModule extends PrivateModule {
   @Exposed
   @Provides
   Lockable provideLockable(
      PublicSelfServiceUnlockUserStepConfig config,
      PublicSelfServiceSettings publicSelfServiceSettings,
      UserPrincipal userPrincipal,
      SigningLogger signingLogger
   ) {
      return new PublicSelfServiceLockable(
         config.isResetFailedLoginsForHtmlLoginapp(),
         publicSelfServiceSettings.getMaxNumberUnlocks().isPresent(),
         this.toAuthenticationMethods(config.getFailedAttemptsCountersToReset()),
         userPrincipal.user(),
         signingLogger
      );
   }

   private List<AuthenticationMethod> toAuthenticationMethods(List<String> authMethodIds) {
      return authMethodIds.stream().map(AuthenticationMethodFactory::authMethodFor).toList();
   }

   protected void configure() {
   }
}
