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

import com.airlock.iam.core.misc.plugin.config.validation.UriPropertyValidator;
import com.airlock.iam.plugin.api.annotation.config.ConfigurationValidator;
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 com.airlock.iam.plugin.api.config.ConfigurationContext;
import com.airlock.iam.plugin.api.config.ConfigurationEnvironment;
import com.airlock.iam.plugin.api.config.Environment;
import com.airlock.iam.plugin.api.config.PluginConfiguration;
import com.airlock.iam.plugin.api.exception.ConfigurationException;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import java.net.URI;

@Plugin(description = "Redirects to the configured URL.", displayName = "OAuth 2.0 Legacy Custom Client Endpoint Redirect")
@PluginLicenseRestriction(moduleAffiliation = "OAuthClient")
public class OAuth2LegacyCustomClientEndpointSupport implements OAuth2LegacyClientEndpointSupport {
   @StringProperty(
      description = "Absolute https URL pointing to the custom OAuth 2.0 client endpoint.",
      optional = false,
      exampleValues = "https://iam.example.ch/custom/oauth2/client",
      displayName = "Redirect URI"
   )
   private String redirectUri;
   private static final String REDIRECT_URI_FIELD = "redirectUri";
   private static final String REDIRECT_URI_DISPLAY_NAME = "Redirect URI";

   @ConfigurationValidator
   static void validateUrl(PluginConfiguration config, ConfigurationEnvironment env, ConfigurationContext context, Environment validationEnvironment) throws ConfigurationException {
      UriPropertyValidator.uriPropertyValidator("redirectUri", "Redirect URI", config, env, context).validateIsAbsolute();
   }

   @Override
   public URI redirectUri() {
      return URI.create(this.redirectUri);
   }

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

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

   @SuppressFBWarnings(justification = "generated code")
   public OAuth2LegacyCustomClientEndpointSupport(String redirectUri) {
      this.redirectUri = redirectUri;
   }

   @SuppressFBWarnings(justification = "generated code")
   public static class OAuth2LegacyCustomClientEndpointSupportBuilder {
      @SuppressFBWarnings(justification = "generated code")
      private String redirectUri;

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

      @SuppressFBWarnings(justification = "generated code")
      public OAuth2LegacyCustomClientEndpointSupport.OAuth2LegacyCustomClientEndpointSupportBuilder redirectUri(String redirectUri) {
         this.redirectUri = redirectUri;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public OAuth2LegacyCustomClientEndpointSupport build() {
         return new OAuth2LegacyCustomClientEndpointSupport(this.redirectUri);
      }

      @SuppressFBWarnings(justification = "generated code")
      @Override
      public String toString() {
         return "OAuth2LegacyCustomClientEndpointSupport.OAuth2LegacyCustomClientEndpointSupportBuilder(redirectUri=" + this.redirectUri + ")";
      }
   }
}
