package com.airlock.iam.common.application.service.user;

import com.airlock.iam.base.misc.log.LogUtil;
import com.airlock.iam.common.api.domain.model.user.User;
import com.airlock.iam.core.domain.model.user.UserToPropagatedNameTransformer;
import com.airlock.iam.core.domain.model.user.UsernameTransformationResult;
import com.airlock.iam.elog.api.ELogger;
import com.airlock.iam.elog.api.ELoggerFactory;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import java.util.List;

public class UserToPropagatedNameTransformationManager {
   private static final ELogger LOG = ELoggerFactory.getLogger(UserToPropagatedNameTransformationManager.class);
   private final List<UserToPropagatedNameTransformer> transformers;

   public String transformUsername(User user) {
      String currentUsername = user.getName();

      for (UserToPropagatedNameTransformer transformer : this.transformers) {
         UsernameTransformationResult res = transformer.transformToPropagatedName(currentUsername, user);
         if (res.transformedUsername().isPresent()) {
            LOG.debug("Username transformed from " + LogUtil.quote(currentUsername) + " to " + LogUtil.quote(res.transformedUsername().get()));
            currentUsername = res.transformedUsername().get();
         }

         if (res.isStopTransformation()) {
            LOG.debug("Username transformation chain explicitly terminated by the transformer.");
            break;
         }
      }

      return currentUsername;
   }

   @SuppressFBWarnings(justification = "generated code")
   public UserToPropagatedNameTransformationManager(List<UserToPropagatedNameTransformer> transformers) {
      this.transformers = transformers;
   }
}
