package com.airlock.iam.admin.infrastructure.service.user;

import com.airlock.iam.admin.infrastructure.validation.ExistingUserService;
import com.airlock.iam.base.api.domain.model.user.UserId;
import com.airlock.iam.common.application.exception.UsernameTransformationException;
import com.airlock.iam.common.infrastructure.targetuser.UriUserIdTransformer;
import jakarta.inject.Inject;
import jakarta.inject.Provider;
import org.apache.commons.lang3.StringUtils;

public final class UserIdResolver {
   private static final int MAX_USERNAME_LENGTH = 500;
   private final Provider<UriUserIdTransformer> uriUserIdTransformer;
   private final Provider<ExistingUserService> existingUserService;

   @Inject
   public UserIdResolver(Provider<UriUserIdTransformer> uriUserIdTransformer, Provider<ExistingUserService> existingUserService) {
      this.uriUserIdTransformer = uriUserIdTransformer;
      this.existingUserService = existingUserService;
   }

   public UserId resolve(String providedUsername) {
      validateUsername(providedUsername);

      try {
         String transformedUserId = ((UriUserIdTransformer)this.uriUserIdTransformer.get()).transform(providedUsername);
         UserId userId = UserId.userId(transformedUserId);
         if (!((ExistingUserService)this.existingUserService.get()).existsUser(userId)) {
            throw new NonexistentUserException(providedUsername, userId);
         } else {
            return userId;
         }
      } catch (UsernameTransformationException e) {
         throw new NonexistentUserException(providedUsername);
      }
   }

   private static void validateUsername(String providedUsername) {
      if (StringUtils.isBlank(providedUsername) || providedUsername.length() > 500) {
         throw new NonexistentUserException(providedUsername);
      }
   }
}
