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

import com.airlock.iam.common.application.configuration.language.LanguageSettingsValidator;
import com.airlock.iam.plugin.api.annotation.config.ConfigurationValidator;
import com.airlock.iam.plugin.api.annotation.config.Groups;
import com.airlock.iam.plugin.api.annotation.config.Plugin;
import com.airlock.iam.plugin.api.annotation.property.GroupProperty;
import com.airlock.iam.plugin.api.annotation.property.StringListProperty;
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.PropertyConfigurationException;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import java.util.List;

@Plugin(description = "Configures the language settings of the Adminapp.")
@Groups(groupSequence = {"Basic Settings", "Advanced Settings"}, openGroups = "Basic Settings")
public class AdminappLanguageSettings {
   @StringListProperty(
      description = "A list of values that are accepted as language parameter values. Corresponding Locales must be available. If the requested language is not in the list, the default language is used. The values in the list are <b>not</b> case-sensitive.",
      optional = true,
      exampleElements = {"de", "fr", "en"},
      minElements = 1,
      defaultValue = {"de", "fr", "en"},
      unique = true
   )
   @GroupProperty(groupIdentifier = "Basic Settings")
   private List<String> validLanguages;
   @StringProperty(
      description = "The default language code used when no (or no valid) information about the current language is present. A corresponding Locale must be available.",
      optional = true,
      defaultValue = "de",
      suggestedValues = {"de", "fr", "en"}
   )
   @GroupProperty(groupIdentifier = "Basic Settings")
   private String defaultLanguage;
   @StringProperty(
      description = "Language dependent string resources for server-side translation (e.g. for emails and SMS) are located in property files. This setting configures the prefix of these property files. <p><b>Example:</b> If the value of this property is <i>strings</i>, the language dependent files must be \"<i>strings</i>_de.properties\", \"<i>strings</i>_en.properties\" and so on and the default file must be \"<i>strings</i>.properties\".</p>",
      optional = true,
      defaultValue = "strings"
   )
   @GroupProperty(groupIdentifier = "Advanced Settings")
   private String resourcesFilePrefix;

   @ConfigurationValidator
   static void checkLanguageValid(PluginConfiguration pc, ConfigurationEnvironment env, ConfigurationContext context, Environment validationEnvironment) throws PropertyConfigurationException {
      LanguageSettingsValidator.checkLanguageValid(pc, env, context);
   }

   @ConfigurationValidator
   static void checkLocales(PluginConfiguration pc, ConfigurationEnvironment env, ConfigurationContext context, Environment validationEnvironment) throws PropertyConfigurationException {
      LanguageSettingsValidator.checkLocales(pc, env, context, validationEnvironment);
   }

   public List<String> getValidLanguages() {
      return this.validLanguages;
   }

   public String getDefaultLanguage() {
      return this.defaultLanguage;
   }

   public String getResourcesFilePrefix() {
      return this.resourcesFilePrefix;
   }

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

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

   @SuppressFBWarnings(justification = "generated code")
   public AdminappLanguageSettings(List<String> validLanguages, String defaultLanguage, String resourcesFilePrefix) {
      this.validLanguages = validLanguages;
      this.defaultLanguage = defaultLanguage;
      this.resourcesFilePrefix = resourcesFilePrefix;
   }

   @SuppressFBWarnings(justification = "generated code")
   public static class AdminappLanguageSettingsBuilder {
      @SuppressFBWarnings(justification = "generated code")
      private List<String> validLanguages;
      @SuppressFBWarnings(justification = "generated code")
      private String defaultLanguage;
      @SuppressFBWarnings(justification = "generated code")
      private String resourcesFilePrefix;

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

      @SuppressFBWarnings(justification = "generated code")
      public AdminappLanguageSettings.AdminappLanguageSettingsBuilder validLanguages(List<String> validLanguages) {
         this.validLanguages = validLanguages;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public AdminappLanguageSettings.AdminappLanguageSettingsBuilder defaultLanguage(String defaultLanguage) {
         this.defaultLanguage = defaultLanguage;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public AdminappLanguageSettings.AdminappLanguageSettingsBuilder resourcesFilePrefix(String resourcesFilePrefix) {
         this.resourcesFilePrefix = resourcesFilePrefix;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public AdminappLanguageSettings build() {
         return new AdminappLanguageSettings(this.validLanguages, this.defaultLanguage, this.resourcesFilePrefix);
      }

      @SuppressFBWarnings(justification = "generated code")
      @Override
      public String toString() {
         return "AdminappLanguageSettings.AdminappLanguageSettingsBuilder(validLanguages="
            + this.validLanguages
            + ", defaultLanguage="
            + this.defaultLanguage
            + ", resourcesFilePrefix="
            + this.resourcesFilePrefix
            + ")";
      }
   }
}
