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

import com.airlock.iam.core.application.configuration.contextdata.StringContextDataItemNameConfig;
import com.airlock.iam.oauth2.api.application.configuration.claims.ClaimConditionConfig;
import com.airlock.iam.oauth2.api.domain.model.claims.UserClaimExtractor;
import com.airlock.iam.oauth2.domain.model.claims.ContextDataClaimValueExtractor;
import com.airlock.iam.oauth2.domain.model.claims.custom.CustomContextDataStringClaimExtractor;
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.PluginProperty;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;

@Plugin(description = "A custom context data string claim.", displayName = "Context Data String Custom Claim")
@PluginLicenseRestriction(moduleAffiliation = "OAuthServer")
public final class CustomContextDataStringClaimConfig extends GenericCustomClaimConfig {
   @PluginProperty(
      description = "The context data field that should be included in the claim. If the value is missing or is not of type string, the claim will not be included in the response.",
      optional = false
   )
   private StringContextDataItemNameConfig contextDataName;

   public StringContextDataItemNameConfig getContextDataName() {
      return this.contextDataName;
   }

   @Override
   public UserClaimExtractor<?> logic() {
      return new CustomContextDataStringClaimExtractor(
         this::getClaimName, this::getClaimCondition, () -> new ContextDataClaimValueExtractor(this.contextDataName.getContextDataName(), this.getClaimName())
      );
   }

   public CustomContextDataStringClaimConfig(String claimName, StringContextDataItemNameConfig contextDataName, ClaimConditionConfig claimCondition) {
      super(claimName, claimCondition);
      this.contextDataName = contextDataName;
   }

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

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

   @SuppressFBWarnings(justification = "generated code")
   public static class CustomContextDataStringClaimConfigBuilder {
      @SuppressFBWarnings(justification = "generated code")
      private String claimName;
      @SuppressFBWarnings(justification = "generated code")
      private StringContextDataItemNameConfig contextDataName;
      @SuppressFBWarnings(justification = "generated code")
      private ClaimConditionConfig claimCondition;

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

      @SuppressFBWarnings(justification = "generated code")
      public CustomContextDataStringClaimConfig.CustomContextDataStringClaimConfigBuilder claimName(String claimName) {
         this.claimName = claimName;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public CustomContextDataStringClaimConfig.CustomContextDataStringClaimConfigBuilder contextDataName(StringContextDataItemNameConfig contextDataName) {
         this.contextDataName = contextDataName;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public CustomContextDataStringClaimConfig.CustomContextDataStringClaimConfigBuilder claimCondition(ClaimConditionConfig claimCondition) {
         this.claimCondition = claimCondition;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public CustomContextDataStringClaimConfig build() {
         return new CustomContextDataStringClaimConfig(this.claimName, this.contextDataName, this.claimCondition);
      }

      @SuppressFBWarnings(justification = "generated code")
      @Override
      public String toString() {
         return "CustomContextDataStringClaimConfig.CustomContextDataStringClaimConfigBuilder(claimName="
            + this.claimName
            + ", contextDataName="
            + this.contextDataName
            + ", claimCondition="
            + this.claimCondition
            + ")";
      }
   }
}
