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

import com.airlock.iam.base.api.domain.model.exception.FailureException;
import com.airlock.iam.base.api.infrastructure.plugin.ModuleForConfig;
import com.airlock.iam.common.application.configuration.state.SingleModeRedisStateRepositoryConfig;
import com.airlock.iam.common.infrastructure.state.redis.RedisStateRepositoryKeySettings;
import com.airlock.iam.common.infrastructure.state.redis.RedisStateRepositorySettings;
import com.airlock.iam.core.misc.util.config.Config;
import com.google.inject.Exposed;
import com.google.inject.PrivateModule;
import com.google.inject.Provides;
import org.redisson.api.RedissonClient;

@ModuleForConfig(SingleModeRedisStateRepositoryConfig.class)
public final class RedisStateRepositoryModule extends PrivateModule {
   @Provides
   @Exposed
   RedissonClient provideRedissonClient(SingleModeRedisStateRepositoryConfig config) {
      return config.getRedissonClient();
   }

   @Provides
   @Exposed
   RedisStateRepositorySettings provideRedisStateRepositoryKeyPrefix(SingleModeRedisStateRepositoryConfig config) {
      RedisStateRepositoryKeySettings keySettings = new RedisStateRepositoryKeySettings(
         config.getNamespace(), determineApplicationIdentifier(), config.useLegacyKeyFormat()
      );
      return new RedisStateRepositorySettings(keySettings);
   }

   private static String determineApplicationIdentifier() {
      return switch (Config.getAppIdentifier().id()) {
         case "adminapp" -> "adminapp";
         case "loginapp" -> "loginapp";
         case "transaction-approval" -> "transaction-approval";
         default -> throw new FailureException("Redis is currently not supported in IAM application " + Config.getAppIdentifier().id());
      };
   }

   protected void configure() {
   }
}
