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

import com.airlock.iam.common.api.application.configuration.credential.RequestAuthenticationConfig;
import com.airlock.iam.common.application.configuration.CorsSettings;
import com.airlock.iam.common.application.configuration.SmsServiceConfig;
import com.airlock.iam.common.application.configuration.CorsSettings.CorsSettingsBuilder;
import com.airlock.iam.core.misc.authen.UsernameTransformer;
import com.airlock.iam.core.misc.util.password.hash.PasswordHash;
import com.airlock.iam.core.misc.util.password.hash.SHA256Base64PasswordHash;
import com.airlock.iam.plugin.api.annotation.config.Plugin;
import com.airlock.iam.plugin.framework.application.service.builder.plugin.PluginPropertyBuilderInitializer;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import java.util.Collections;
import java.util.List;
import java.util.Optional;

@Plugin(
   description = "Denies all access to the Adminapp REST API from clients other then the Adminapp GUI.",
   displayName = "Denying Adminapp REST API Configuration"
)
public class DenyingAdminappRestConfig implements AdminappRestConfigSpec {
   private static final Optional<PasswordHash> DEFAULT_PASSWORD_HASH = Optional.of(new SHA256Base64PasswordHash());
   private static final CorsSettings DEFAULT_CORS_SETTINGS = PluginPropertyBuilderInitializer.builder(CorsSettingsBuilder.class).build();

   public List<UsernameTransformer> getUsernameTransformers() {
      return Collections.emptyList();
   }

   public boolean isLinkResponseRewritingEnabled() {
      return true;
   }

   public Optional<String> getBaseUri() {
      return Optional.empty();
   }

   @Override
   public CorsSettings getCorsSettings() {
      return DEFAULT_CORS_SETTINGS;
   }

   @Override
   public Optional<SmsServiceConfig> getSmsServiceConfig() {
      return Optional.empty();
   }

   @Override
   public Optional<PasswordHash> getHashFunction() {
      return DEFAULT_PASSWORD_HASH;
   }

   @Override
   public Optional<String> getHashSharedSecret() {
      return Optional.empty();
   }

   public Optional<RequestAuthenticationConfig> getRequestAuthenticationConfig() {
      return Optional.empty();
   }

   @Override
   public boolean isCsrfProtected() {
      return true;
   }

   @Override
   public int getDefaultPageSize() {
      return 500;
   }

   @Override
   public int getMaxPageSize() {
      return 5000;
   }

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

   @SuppressFBWarnings(justification = "generated code")
   public static class DenyingAdminappRestConfigBuilder {
      @SuppressFBWarnings(justification = "generated code")
      DenyingAdminappRestConfigBuilder() {
      }

      @SuppressFBWarnings(justification = "generated code")
      public DenyingAdminappRestConfig build() {
         return new DenyingAdminappRestConfig();
      }

      @SuppressFBWarnings(justification = "generated code")
      @Override
      public String toString() {
         return "DenyingAdminappRestConfig.DenyingAdminappRestConfigBuilder()";
      }
   }
}
