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

import com.airlock.iam.common.api.domain.model.persistency.exception.NotFoundException;
import com.airlock.iam.common.api.domain.model.persistency.exception.NotUniqueException;
import com.airlock.iam.common.application.configuration.RestConfigSpec;
import com.airlock.iam.common.application.exception.UsernameTransformationException;
import com.airlock.iam.core.misc.authen.LogTypes;
import com.airlock.iam.core.misc.authen.UsernameTransformationManager;
import com.airlock.iam.core.misc.authen.UsernameTransformer;
import com.airlock.iam.elog.api.ELogger;
import com.airlock.iam.elog.api.ELoggerFactory;
import jakarta.inject.Inject;
import jakarta.inject.Provider;
import java.util.List;

public class UriUserIdTransformer {
   private static final ELogger LOG = ELoggerFactory.getLogger(UriUserIdTransformer.class);
   private final Provider<RestConfigSpec> restConfigSpec;

   @Inject
   public UriUserIdTransformer(Provider<RestConfigSpec> restConfigSpec) {
      this.restConfigSpec = restConfigSpec;
   }

   public String transform(String uriUserId) throws UsernameTransformationException {
      List<UsernameTransformer> transformers = ((RestConfigSpec)this.restConfigSpec.get()).getUsernameTransformers();
      UsernameTransformationManager manager = new UsernameTransformationManager(transformers);

      try {
         return manager.transformProvidedUsername(uriUserId);
      } catch (NotUniqueException | NotFoundException e) {
         LOG.info(LogTypes.USER_INVALID_SAT, String.format("Could not transform username '%s'", uriUserId), e);
         throw new UsernameTransformationException(e);
      }
   }
}
