package com.airlock.iam.common.application;

import com.airlock.iam.base.api.domain.model.exception.ViolationException;
import com.airlock.iam.base.api.domain.model.user.UserId;
import com.airlock.iam.base.misc.log.LogUtil;
import com.airlock.iam.common.api.domain.model.user.UserIdentity;
import com.airlock.iam.common.application.exception.UsernameTransformationException;
import com.airlock.iam.common.infrastructure.targetuser.UriUserIdTransformer;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import jakarta.inject.Provider;
import jakarta.ws.rs.ext.ParamConverter;
import org.apache.commons.lang3.StringUtils;

final class UserParamConverter implements ParamConverter<UserParam> {
   private static final int MAX_USERNAME_LENGTH = 500;
   private final Provider<UriUserIdTransformer> uriUserIdTransformer;

   public UserParam fromString(String value) throws UsernameTransformationException {
      validateUsername(value);
      UriUserIdTransformer transformer = (UriUserIdTransformer)this.uriUserIdTransformer.get();
      String transformedUserId = transformer.transform(value);
      return new UserParam(new UserIdentity(UserId.userId(transformedUserId), value));
   }

   private static void validateUsername(String value) {
      if (StringUtils.isBlank(value) || value.length() > 500) {
         throw new ViolationException("Invalid username: " + LogUtil.logSafeString(value));
      }
   }

   public String toString(UserParam value) {
      return value.getUserIdentity().providedUsername().getValue();
   }

   @SuppressFBWarnings(justification = "generated code")
   public UserParamConverter(Provider<UriUserIdTransformer> uriUserIdTransformer) {
      this.uriUserIdTransformer = uriUserIdTransformer;
   }
}
