package com.airlock.iam.oauth2.application.configuration;

import com.airlock.iam.core.domain.model.http.HttpRequestHeader;
import com.airlock.iam.core.domain.model.http.HttpRequestParameter;
import com.airlock.iam.login.api.domain.model.oauth2.AccessToken;
import com.airlock.iam.oauth2.domain.model.client.communication.OAuth2ResourceRequestSecretProcessor;
import com.airlock.iam.plugin.api.annotation.config.Plugin;
import com.airlock.iam.plugin.api.annotation.license.PluginLicenseRestriction;
import com.airlock.iam.plugin.api.annotation.property.StringProperty;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import java.util.List;
import org.apache.commons.lang3.StringUtils;

@Plugin(description = "Configuration for the OAuth 2.0 Access Token header format.", displayName = "OAuth 2.0 Header Access Token Config")
@PluginLicenseRestriction(moduleAffiliation = {"OAuthServer", "OAuthClient"})
public class OAuth2HeaderAccessTokenConfig implements OAuth2ResourceRequestSecretProcessor {
   @StringProperty(description = "Name of the header field containing the OAuth 2.0 Access Token.", optional = true, defaultValue = "Authorization")
   private String headerFieldName;
   @StringProperty(
      description = "Header field value prefix. The prefix must match exactly.<br>A header prefix denotes the first part of a space delimited header value.<br>Eg. \"Authorization: Bearer 2q93nf8q23UIZFR2qfh98\" where \"Authorization\" denotes the header field name, \"Bearer\" the header prefix and \"2q93nf8q23UIZFR2qfh98\" the Access Token.",
      optional = true,
      suggestedValues = {"Bearer", "OAuth"}
   )
   private String headerPrefix;

   @Override
   public void putAccessTokenInRequestData(AccessToken accessToken, List<HttpRequestParameter> params, List<HttpRequestHeader> headers) {
      if (StringUtils.isBlank(this.headerPrefix)) {
         headers.add(HttpRequestHeader.httpRequestHeader(this.headerFieldName, accessToken.value()));
      } else {
         headers.add(HttpRequestHeader.httpRequestHeader(this.headerFieldName, this.headerPrefix + " " + accessToken.value()));
      }
   }

   public String getHeaderFieldName() {
      return this.headerFieldName;
   }

   public String getHeaderPrefix() {
      return this.headerPrefix;
   }

   @SuppressFBWarnings(justification = "generated code")
   public static OAuth2HeaderAccessTokenConfig.OAuth2HeaderAccessTokenConfigBuilder builder() {
      return new OAuth2HeaderAccessTokenConfig.OAuth2HeaderAccessTokenConfigBuilder();
   }

   @SuppressFBWarnings(justification = "generated code")
   public OAuth2HeaderAccessTokenConfig(String headerFieldName, String headerPrefix) {
      this.headerFieldName = headerFieldName;
      this.headerPrefix = headerPrefix;
   }

   @SuppressFBWarnings(justification = "generated code")
   public OAuth2HeaderAccessTokenConfig() {
   }

   @SuppressFBWarnings(justification = "generated code")
   public static class OAuth2HeaderAccessTokenConfigBuilder {
      @SuppressFBWarnings(justification = "generated code")
      private String headerFieldName;
      @SuppressFBWarnings(justification = "generated code")
      private String headerPrefix;

      @SuppressFBWarnings(justification = "generated code")
      OAuth2HeaderAccessTokenConfigBuilder() {
      }

      @SuppressFBWarnings(justification = "generated code")
      public OAuth2HeaderAccessTokenConfig.OAuth2HeaderAccessTokenConfigBuilder headerFieldName(String headerFieldName) {
         this.headerFieldName = headerFieldName;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public OAuth2HeaderAccessTokenConfig.OAuth2HeaderAccessTokenConfigBuilder headerPrefix(String headerPrefix) {
         this.headerPrefix = headerPrefix;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public OAuth2HeaderAccessTokenConfig build() {
         return new OAuth2HeaderAccessTokenConfig(this.headerFieldName, this.headerPrefix);
      }

      @SuppressFBWarnings(justification = "generated code")
      @Override
      public String toString() {
         return "OAuth2HeaderAccessTokenConfig.OAuth2HeaderAccessTokenConfigBuilder(headerFieldName="
            + this.headerFieldName
            + ", headerPrefix="
            + this.headerPrefix
            + ")";
      }
   }
}
