package com.airlock.iam.oauth2.domain.model.authorization;

import com.airlock.iam.base.api.domain.model.plugin.LogicForConfig;
import com.airlock.iam.flow.api.domain.model.session.FlowAttributeRepository;
import com.airlock.iam.flow.shared.domain.model.uitenantid.UiTenantId;
import com.airlock.iam.flow.shared.domain.model.uitenantid.UiTenantIdRule;
import com.airlock.iam.oauth2.api.domain.model.OAuth2ClientId;
import com.airlock.iam.oauth2.application.configuration.OAuth2ClientIdUiTenantIdRuleConfig;
import com.airlock.iam.oauth2.domain.model.codegrant.OAuth2AuthorizationCodeGrantFlowSessionAttribute;
import com.airlock.iam.oauth2.domain.model.codegrant.OAuth2OidcAuthorizationRequestAttributes;
import jakarta.inject.Inject;
import jakarta.inject.Provider;
import java.util.Optional;

@LogicForConfig(OAuth2ClientIdUiTenantIdRuleConfig.class)
public final class OAuth2ClientIdUiTenantIdRule implements UiTenantIdRule {
   private final Provider<FlowAttributeRepository> attributeRepository;

   @Inject
   public OAuth2ClientIdUiTenantIdRule(Provider<FlowAttributeRepository> attributeRepository) {
      this.attributeRepository = attributeRepository;
   }

   @Override
   public Optional<UiTenantId> getUiTenantId() {
      return ((FlowAttributeRepository)this.attributeRepository.get())
         .tryGetAttribute(OAuth2AuthorizationCodeGrantFlowSessionAttribute.class)
         .map(OAuth2AuthorizationCodeGrantFlowSessionAttribute::request)
         .map(OAuth2OidcAuthorizationRequestAttributes::clientId)
         .map(OAuth2ClientId::id)
         .map(UiTenantId::new);
   }
}
