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

import com.airlock.iam.flow.api.application.configuration.selection.FlowConditionConfig;
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.api.annotation.property.StringProperty;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;

@Plugin(
   description = "Uses a specific Authentication Context if the Flow Condition can be satisfied.",
   displayName = "Flow Condition To Authentication Context Mapping"
)
@PluginLicenseRestriction(moduleAffiliation = "SamlIdp")
public final class Saml2FlowConditionToAuthnContextMapping {
   @PluginProperty(
      description = "If this condition is fulfilled, the configured Authentication Context will be used in the Assertion (<tt>AuthnContextClassRef</tt> element).",
      displayName = "Flow Condition",
      optional = false
   )
   private FlowConditionConfig flowCondition;
   @StringProperty(
      displayName = "Authentication Context",
      description = "<p>The Authentication Context URI to be used if the configured flow condition is satisfied.</p><p>The available context classes are configured in the IDP extended metadata under the attribute \"idpAuthncontextClassrefMapping\". Only URIs in that list are valid to be set here.</p>",
      optional = false,
      suggestedValues = {
            "urn:oasis:names:tc:SAML:2.0:ac:classes:InternetProtocol",
            "urn:oasis:names:tc:SAML:2.0:ac:classes:InternetProtocolPassword",
            "urn:oasis:names:tc:SAML:2.0:ac:classes:Kerberos",
            "urn:oasis:names:tc:SAML:2.0:ac:classes:MobileOneFactorUnregistered",
            "urn:oasis:names:tc:SAML:2.0:ac:classes:MobileTwoFactorUnregistered",
            "urn:oasis:names:tc:SAML:2.0:ac:classes:MobileOneFactorContract",
            "urn:oasis:names:tc:SAML:2.0:ac:classes:MobileTwoFactorContract",
            "urn:oasis:names:tc:SAML:2.0:ac:classes:Password",
            "urn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransport",
            "urn:oasis:names:tc:SAML:2.0:ac:classes:PreviousSession",
            "urn:oasis:names:tc:SAML:2.0:ac:classes:X509",
            "urn:oasis:names:tc:SAML:2.0:ac:classes:PGP",
            "urn:oasis:names:tc:SAML:2.0:ac:classes:SPKI",
            "urn:oasis:names:tc:SAML:2.0:ac:classes:XMLDSig",
            "urn:oasis:names:tc:SAML:2.0:ac:classes:Smartcard",
            "urn:oasis:names:tc:SAML:2.0:ac:classes:SmartcardPKI",
            "urn:oasis:names:tc:SAML:2.0:ac:classes:SoftwarePKI",
            "urn:oasis:names:tc:SAML:2.0:ac:classes:Telephony",
            "urn:oasis:names:tc:SAML:2.0:ac:classes:NomadTelephony",
            "urn:oasis:names:tc:SAML:2.0:ac:classes:PersonalTelephony",
            "urn:oasis:names:tc:SAML:2.0:ac:classes:AuthenticatedTelephony",
            "urn:oasis:names:tc:SAML:2.0:ac:classes:SecureRemotePassword",
            "urn:oasis:names:tc:SAML:2.0:ac:classes:TLSClient",
            "urn:oasis:names:tc:SAML:2.0:ac:classes:TimeSyncToken",
            "urn:oasis:names:tc:SAML:2.0:ac:classes:unspecified"
      }
   )
   private String authnContextUri;

   public FlowConditionConfig getFlowCondition() {
      return this.flowCondition;
   }

   public String getAuthnContextUri() {
      return this.authnContextUri;
   }

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

   @SuppressFBWarnings(justification = "generated code")
   public Saml2FlowConditionToAuthnContextMapping(FlowConditionConfig flowCondition, String authnContextUri) {
      this.flowCondition = flowCondition;
      this.authnContextUri = authnContextUri;
   }

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

   @SuppressFBWarnings(justification = "generated code")
   public static class Saml2FlowConditionToAuthnContextMappingBuilder {
      @SuppressFBWarnings(justification = "generated code")
      private FlowConditionConfig flowCondition;
      @SuppressFBWarnings(justification = "generated code")
      private String authnContextUri;

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

      @SuppressFBWarnings(justification = "generated code")
      public Saml2FlowConditionToAuthnContextMapping.Saml2FlowConditionToAuthnContextMappingBuilder flowCondition(FlowConditionConfig flowCondition) {
         this.flowCondition = flowCondition;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public Saml2FlowConditionToAuthnContextMapping.Saml2FlowConditionToAuthnContextMappingBuilder authnContextUri(String authnContextUri) {
         this.authnContextUri = authnContextUri;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public Saml2FlowConditionToAuthnContextMapping build() {
         return new Saml2FlowConditionToAuthnContextMapping(this.flowCondition, this.authnContextUri);
      }

      @SuppressFBWarnings(justification = "generated code")
      @Override
      public String toString() {
         return "Saml2FlowConditionToAuthnContextMapping.Saml2FlowConditionToAuthnContextMappingBuilder(flowCondition="
            + this.flowCondition
            + ", authnContextUri="
            + this.authnContextUri
            + ")";
      }
   }
}
