package com.airlock.iam.flow.shared.application.configuration.message;

import com.airlock.iam.core.misc.cronto.CrontoHandler;
import com.airlock.iam.flow.api.application.configuration.valueprovider.ValueMapProviderConfig;
import com.airlock.iam.flow.shared.application.configuration.valueprovider.ContextDataValueMapProviderConfig;
import com.airlock.iam.flow.shared.application.configuration.valueprovider.UserStatisticsValueMapProviderConfig;
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 com.airlock.iam.plugin.framework.application.service.builder.plugin.PluginPropertyBuilderInitializer;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import java.util.List;

@Plugin(
   description = "<p>Provides the default Cronto login message.</p><p>This plugin configures a Generic Cronto Message Provider for the translation string <tt>cronto.login-message</tt> with the two value map providers for the user's context-data and user statistics.</p>"
)
@PluginLicenseRestriction(moduleAffiliation = "Cronto")
public class DefaultCrontoLoginMessageProviderConfig implements GenericCrontoMessageProviderConfigSpec {
   private static final List<ValueMapProviderConfig> VALUE_MAP_PROVIDER_CONFIGS = List.of(
      pluginBuilder(ContextDataValueMapProviderConfig.ContextDataValueMapProviderConfigBuilder.class).build(),
      pluginBuilder(UserStatisticsValueMapProviderConfig.UserStatisticsValueMapProviderConfigBuilder.class).build()
   );
   @PluginProperty(
      description = "Cronto Handler to determine if a message is small enough to be encoded as a cryptogram. This is used for \"shrinking\" the growable message until it fits into a cryptogram. If it cannot be shrunk enough, an exception is thrown.",
      globalPluginReference = "globalCrontoSettings",
      optional = false
   )
   private CrontoHandler crontoHandler;
   private final String messageResourceKey = "cronto.login-message";
   private final String pushTitleResourceKey = "cronto.push.login.title";
   private final String pushSubjectResourceKey = "cronto.push.login.subject";
   private final List<ValueMapProviderConfig> valueProviders = VALUE_MAP_PROVIDER_CONFIGS;
   private final boolean omitEmptyValueLines = true;

   @Override
   public CrontoHandler getCrontoHandler() {
      return this.crontoHandler;
   }

   @Override
   public String getMessageResourceKey() {
      return "cronto.login-message";
   }

   public String getPushTitleResourceKey() {
      return "cronto.push.login.title";
   }

   public String getPushSubjectResourceKey() {
      return "cronto.push.login.subject";
   }

   @Override
   public List<ValueMapProviderConfig> getValueProviders() {
      return this.valueProviders;
   }

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

   private static <T> T pluginBuilder(Class<T> builderClass) {
      return (T)PluginPropertyBuilderInitializer.builder(builderClass);
   }

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

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

   @SuppressFBWarnings(justification = "generated code")
   public DefaultCrontoLoginMessageProviderConfig(CrontoHandler crontoHandler) {
      this.crontoHandler = crontoHandler;
   }

   @SuppressFBWarnings(justification = "generated code")
   public static class DefaultCrontoLoginMessageProviderConfigBuilder {
      @SuppressFBWarnings(justification = "generated code")
      private CrontoHandler crontoHandler;

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

      @SuppressFBWarnings(justification = "generated code")
      public DefaultCrontoLoginMessageProviderConfig.DefaultCrontoLoginMessageProviderConfigBuilder crontoHandler(CrontoHandler crontoHandler) {
         this.crontoHandler = crontoHandler;
         return this;
      }

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

      @SuppressFBWarnings(justification = "generated code")
      @Override
      public String toString() {
         return "DefaultCrontoLoginMessageProviderConfig.DefaultCrontoLoginMessageProviderConfigBuilder(crontoHandler=" + this.crontoHandler + ")";
      }
   }
}
