package com.airlock.iam.flow.shared.domain.model.valueprovider;

import com.airlock.iam.base.api.domain.model.plugin.LogicForConfig;
import com.airlock.iam.common.api.domain.model.user.UserIdentity;
import com.airlock.iam.common.api.domain.model.user.UsernameToPropagate;
import com.airlock.iam.common.domain.model.user.PrincipalInfo;
import com.airlock.iam.flow.shared.api.domain.model.valueprovider.ValueMapProvider;
import com.airlock.iam.flow.shared.application.configuration.valueprovider.UserIdentityValueMapProviderConfig;
import jakarta.inject.Inject;
import jakarta.inject.Provider;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import java.util.Optional;

@LogicForConfig(UserIdentityValueMapProviderConfig.class)
public final class UserIdentityValueMapProvider implements ValueMapProvider {
   private final Provider<PrincipalInfo> userInfo;
   private final Provider<Optional<UsernameToPropagate>> usernameToPropagate;

   @Inject
   public UserIdentityValueMapProvider(Provider<PrincipalInfo> userInfo, Provider<Optional<UsernameToPropagate>> usernameToPropagate) {
      this.userInfo = userInfo;
      this.usernameToPropagate = usernameToPropagate;
   }

   @Override
   public Map<String, Object> provideValueMap() {
      Optional<UserIdentity> identity = ((PrincipalInfo)this.userInfo.get()).getKnownIdentity();
      if (identity.isEmpty()) {
         return Collections.emptyMap();
      }

      Map<String, Object> map = new HashMap<>();
      map.put("user-id", identity.get().id().getValue());
      map.put("provided-username", identity.get().providedUsername().getValue());
      ((Optional)this.usernameToPropagate.get()).ifPresent(name -> map.put("username-to-propagate", name.value()));
      identity.get().representerId().ifPresent(id -> map.put("representer-user-id", id.value()));
      return Map.copyOf(map);
   }
}
