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

import com.airlock.iam.base.api.domain.model.plugin.LogicForConfig;
import com.airlock.iam.common.api.domain.model.valueprovider.CachingValueProvider;
import com.airlock.iam.core.domain.service.OAuth2ClientCredentialsGrantAccessTokenLoader;
import com.airlock.iam.oauth2.application.configuration.valueprovider.OAuth2AccessTokenStringValueProviderConfig;
import jakarta.annotation.Nullable;
import jakarta.inject.Inject;
import jakarta.inject.Provider;
import java.net.URI;

@LogicForConfig(OAuth2AccessTokenStringValueProviderConfig.class)
public class OAuth2AccessTokenProvider implements CachingValueProvider<String> {
   private final Provider<OAuth2AccessTokenSettings> accessTokenSettings;
   private final Provider<OAuth2ClientCredentialsGrantAccessTokenLoader> remoteAccessTokenLoader;

   @Inject
   public OAuth2AccessTokenProvider(
      Provider<OAuth2AccessTokenSettings> accessTokenSettings, Provider<OAuth2ClientCredentialsGrantAccessTokenLoader> remoteAccessTokenLoader
   ) {
      this.accessTokenSettings = accessTokenSettings;
      this.remoteAccessTokenLoader = remoteAccessTokenLoader;
   }

   @Nullable
   public String getValue() {
      URI tokenEndpointUri = ((OAuth2AccessTokenSettings)this.accessTokenSettings.get()).tokenEndpointURL();
      return ((OAuth2ClientCredentialsGrantAccessTokenLoader)this.remoteAccessTokenLoader.get()).getAccessToken(tokenEndpointUri);
   }

   public String getValue(boolean forceRefresh) {
      URI tokenEndpointUri = ((OAuth2AccessTokenSettings)this.accessTokenSettings.get()).tokenEndpointURL();
      return ((OAuth2ClientCredentialsGrantAccessTokenLoader)this.remoteAccessTokenLoader.get()).getAccessToken(tokenEndpointUri, forceRefresh);
   }
}
