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

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.FileProperty;
import com.airlock.iam.plugin.api.annotation.property.PluginProperty;
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 com.airlock.iam.saml2.application.configuration.validation.Saml2MetadataValidator;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import java.io.File;

@Plugin(description = "<p>Configures a specific SAML 2.0 Service Provider (SP).</p>", displayName = "SAML 2.0 Service Provider Entity")
@PluginLicenseRestriction(moduleAffiliation = {"SamlIdp", "SamlSp"})
public final class Saml2SPEntityConfig {
   @PluginProperty(description = "Unique ID of this Service Provider.", optional = false, displayName = "SP Entity ID")
   private Saml2ServiceProviderIdConfig entityId;
   public static final String SERVICE_PROVIDER_ID_PROPERTY = "entityId";
   @FileProperty(
      description = "<p>The name of the file containing the standard metadata of this entity.</p><p>Can either be relative to the config root or absolute.</p><p><b>NOTE</b>: When the metadata is changed, the login application needs to be restarted.</p>",
      displayName = "Metadata File",
      isFile = true,
      assureExistence = true,
      assureReadable = true,
      optional = false,
      exampleValues = "instances/test/saml2/sp.xml"
   )
   private File metaDataFile;
   private static final String META_DATA_FILE_PROPERTY = "metaDataFile";
   public static final String META_DATA_FILE_DISPLAY_NAME = "Metadata File";
   @FileProperty(
      description = "<p>The name of the file containing the extended metadata of this entity.</p><p>Can either be relative to the config root or absolute.</p><p><b>NOTE</b>: When the metadata is changed, the login application needs to be restarted.</p>",
      displayName = "Extended Metadata File",
      isFile = true,
      assureExistence = true,
      assureReadable = true,
      optional = false,
      exampleValues = "instances/test/saml2/sp-extended.xml"
   )
   private File extendedMetaDataFile;
   private static final String EXTENDED_META_DATA_FILE_PROPERTY = "extendedMetaDataFile";
   public static final String EXTENDED_META_DATA_FILE_DISPLAY_NAME = "Extended Metadata File";

   @ConfigurationValidator
   static void validateMetadata(PluginConfiguration config, ConfigurationEnvironment env, ConfigurationContext context, Environment validationEnvironment) throws ConfigurationException {
      if (validationEnvironment == Environment.CURRENT_VM) {
         new Saml2MetadataValidator(config, env, context).validateStandardMetadataFile("metaDataFile").validateExtendedMetadataFile("extendedMetaDataFile");
      }
   }

   public String getEntityId() {
      return this.entityId.getSpEntityId();
   }

   public File getMetaDataFile() {
      return this.metaDataFile;
   }

   public File getExtendedMetaDataFile() {
      return this.extendedMetaDataFile;
   }

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

   @SuppressFBWarnings(justification = "generated code")
   public Saml2SPEntityConfig(Saml2ServiceProviderIdConfig entityId, File metaDataFile, File extendedMetaDataFile) {
      this.entityId = entityId;
      this.metaDataFile = metaDataFile;
      this.extendedMetaDataFile = extendedMetaDataFile;
   }

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

   @SuppressFBWarnings(justification = "generated code")
   public static class Saml2SPEntityConfigBuilder {
      @SuppressFBWarnings(justification = "generated code")
      private Saml2ServiceProviderIdConfig entityId;
      @SuppressFBWarnings(justification = "generated code")
      private File metaDataFile;
      @SuppressFBWarnings(justification = "generated code")
      private File extendedMetaDataFile;

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

      @SuppressFBWarnings(justification = "generated code")
      public Saml2SPEntityConfig.Saml2SPEntityConfigBuilder entityId(Saml2ServiceProviderIdConfig entityId) {
         this.entityId = entityId;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public Saml2SPEntityConfig.Saml2SPEntityConfigBuilder metaDataFile(File metaDataFile) {
         this.metaDataFile = metaDataFile;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public Saml2SPEntityConfig.Saml2SPEntityConfigBuilder extendedMetaDataFile(File extendedMetaDataFile) {
         this.extendedMetaDataFile = extendedMetaDataFile;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public Saml2SPEntityConfig build() {
         return new Saml2SPEntityConfig(this.entityId, this.metaDataFile, this.extendedMetaDataFile);
      }

      @SuppressFBWarnings(justification = "generated code")
      @Override
      public String toString() {
         return "Saml2SPEntityConfig.Saml2SPEntityConfigBuilder(entityId="
            + this.entityId
            + ", metaDataFile="
            + this.metaDataFile
            + ", extendedMetaDataFile="
            + this.extendedMetaDataFile
            + ")";
      }
   }
}
