package com.l7tech.policy.assertion.xmlsec;

import com.l7tech.objectmodel.ExternalEntityHeader;
import com.l7tech.objectmodel.migration.Migration;
import com.l7tech.objectmodel.migration.MigrationMappingSelection;
import com.l7tech.objectmodel.migration.PropertyResolver;
import com.l7tech.policy.assertion.AssertionUtils;
import com.l7tech.policy.assertion.MessageTargetable;
import com.l7tech.policy.assertion.MessageTargetableSupport;
import com.l7tech.policy.assertion.SetsVariables;
import com.l7tech.policy.assertion.TargetMessageType;
import com.l7tech.policy.assertion.UsesVariables;
import com.l7tech.policy.variable.DataType;
import com.l7tech.policy.variable.VariableMetadata;
import com.l7tech.util.TimeUnit;

public abstract class RequireSaml extends SamlPolicyAssertion implements MessageTargetable, UsesVariables, SetsVariables {
   public static final long UPPER_BOUND_FOR_MAX_EXPIRY = 3153600000000L;
   public static final String DEFAULT_VARIABLE_PREFIX;
   public static final String PREFIX_SAML_ATTR;
   public static final String VARIABLE_REASON_CODE;
   protected String[] subjectConfirmations = new String[0];
   protected String subjectConfirmationDataRecipient;
   protected boolean subjectConfirmationDataCheckAddress = false;
   protected boolean subjectConfirmationDataCheckValidity = true;
   protected String[] nameFormats = new String[0];
   protected boolean checkAssertionValidity = true;
   protected long maxExpiry = 0L;
   private TimeUnit timeUnit = TimeUnit.MINUTES;
   protected MessageTargetableSupport messageTargetableSupport = new MessageTargetableSupport(false);
   static final long serialVersionUID = -730416027896012370L;
   private static final String[] b;

   public String[] getSubjectConfirmations() {
      return this.subjectConfirmations;
   }

   public void setSubjectConfirmations(String[] var1) {
      if (var1 == null) {
         this.subjectConfirmations = new String[0];
      } else {
         this.subjectConfirmations = var1;
      }
   }

   public boolean isCheckAssertionValidity() {
      return this.checkAssertionValidity;
   }

   public void setCheckAssertionValidity(boolean var1) {
      this.checkAssertionValidity = var1;
   }

   public long getMaxExpiry() {
      return this.maxExpiry;
   }

   public void setMaxExpiry(long var1) {
      this.maxExpiry = var1;
   }

   public TimeUnit getTimeUnit() {
      return this.timeUnit;
   }

   public void setTimeUnit(TimeUnit var1) {
      this.timeUnit = var1;
   }

   public String[] getNameFormats() {
      return this.nameFormats;
   }

   public void setNameFormats(String[] var1) {
      if (var1 == null) {
         this.nameFormats = new String[0];
      } else {
         this.nameFormats = var1;
      }
   }

   public String getSubjectConfirmationDataRecipient() {
      return this.subjectConfirmationDataRecipient;
   }

   public void setSubjectConfirmationDataRecipient(String var1) {
      this.subjectConfirmationDataRecipient = var1;
   }

   public boolean isSubjectConfirmationDataCheckAddress() {
      return this.subjectConfirmationDataCheckAddress;
   }

   public void setSubjectConfirmationDataCheckAddress(boolean var1) {
      this.subjectConfirmationDataCheckAddress = var1;
   }

   public boolean isSubjectConfirmationDataCheckValidity() {
      return this.subjectConfirmationDataCheckValidity;
   }

   public void setSubjectConfirmationDataCheckValidity(boolean var1) {
      this.subjectConfirmationDataCheckValidity = var1;
   }

   @Override
   public VariableMetadata[] getVariablesSet() {
      MessageTargetableSupport.VariablesSet var10000 = this.messageTargetableSupport.getMessageTargetVariablesSet();
      VariableMetadata[] var10001 = new VariableMetadata[2];
      String[] var1 = b;
      var10001[0] = new VariableMetadata(var1[6], true, true, var1[7], false);
      var10001[1] = new VariableMetadata(var1[8], false, false, null, true, DataType.INTEGER);
      return var10000.withVariables(var10001).asArray();
   }

   @Migration(
      mapName = MigrationMappingSelection.NONE,
      mapValue = MigrationMappingSelection.REQUIRED,
      export = false,
      valueType = ExternalEntityHeader.ValueType.TEXT_ARRAY,
      resolver = PropertyResolver.Type.SERVER_VARIABLE
   )
   @Override
   public String[] getVariablesUsed() {
      return this.messageTargetableSupport
         .getMessageTargetVariablesUsed()
         .withExpressions(
            this.subjectConfirmationDataRecipient,
            this.nameQualifier,
            this.audienceRestriction,
            this.authenticationStatement != null ? this.authenticationStatement.getCustomAuthenticationMethods() : ""
         )
         .asArray();
   }

   @Override
   public String getOtherTargetMessageVariable() {
      return this.messageTargetableSupport.getOtherTargetMessageVariable();
   }

   @Override
   public TargetMessageType getTarget() {
      return this.messageTargetableSupport.getTarget();
   }

   @Override
   public String getTargetName() {
      return this.messageTargetableSupport.getTargetName();
   }

   @Override
   public boolean isTargetModifiedByGateway() {
      return this.messageTargetableSupport.isTargetModifiedByGateway();
   }

   @Override
   public void setOtherTargetMessageVariable(String var1) {
      this.messageTargetableSupport.setOtherTargetMessageVariable(var1);
   }

   @Override
   public void setTarget(TargetMessageType var1) {
      this.messageTargetableSupport.setTarget(var1);
   }

   @Override
   public Object clone() {
      RequireSaml var1 = (RequireSaml)super.clone();
      var1.messageTargetableSupport = new MessageTargetableSupport(this.messageTargetableSupport);
      var1.subjectConfirmations = (String[])this.subjectConfirmations.clone();
      var1.nameFormats = (String[])this.nameFormats.clone();
      return var1;
   }

   public String describe() {
      String[] var2 = b;
      String var1 = var2[2];
      if (this.getAuthenticationStatement() != null) {
         var1 = var2[4];
      } else if (this.getAttributeStatement() != null) {
         var2 = b;
         var1 = var2[3];
      } else if (this.getAuthorizationStatement() != null) {
         var1 = b[1];
      }

      if (this.getVersion() != null && this.getVersion() != 0) {
         var1 = "v" + this.getVersion() + " " + var1;
      }

      return AssertionUtils.decorateName(this, this.getAssertionDisplayName() + " " + var1);
   }

   public void copyFrom(RequireSaml var1) {
      this.setAssertionComment(var1.getAssertionComment());
      this.setAttributeStatement(var1.getAttributeStatement());
      this.setAudienceRestriction(var1.getAudienceRestriction());
      this.setAuthenticationStatement(var1.getAuthenticationStatement());
      this.setAuthorizationStatement(var1.getAuthorizationStatement());
      this.setCheckAssertionValidity(var1.isCheckAssertionValidity());
      this.setNameFormats(var1.getNameFormats());
      this.setNameQualifier(var1.getNameQualifier());
      this.setNoSubjectConfirmation(var1.isNoSubjectConfirmation());
      this.setParent(var1.getParent());
      this.setSubjectConfirmations(var1.getSubjectConfirmations());
      this.setVersion(var1.getVersion());
      this.setTarget(var1.getTarget());
      this.setOtherTargetMessageVariable(var1.getOtherTargetMessageVariable());
      this.setEnabled(var1.isEnabled());
      this.setSubjectConfirmationDataCheckAddress(var1.isSubjectConfirmationDataCheckAddress());
      this.setSubjectConfirmationDataCheckValidity(var1.isSubjectConfirmationDataCheckValidity());
      this.setSubjectConfirmationDataRecipient(var1.getSubjectConfirmationDataRecipient());
      this.setMaxExpiry(var1.getMaxExpiry());
      this.setTimeUnit(var1.getTimeUnit());
   }

   protected abstract String getAssertionDisplayName();

   static {
      String[] var5 = new String[9];
      int var3 = 0;
      String var2 = " ^s}M2K2Lq\u007f /J6 \u0012Jjy\f2G)^jx\f.\u000e\u0017Z}x\u0010)A=\u001fMe\u00024K>Zpe\u0011\u0006Qu\u007f\f7@sljp\u0017%C6Qj\u0013\u0012Kjc\n\"['Z>B\u0017!Z6R{\u007f\u0017\u0018\u0012Jjy\u0006.Z:\\\u007fe\n/@sljp\u0017%C6Qj\u0004 ^s}\t ^s}M!Z'M";
      int var4 = " ^s}M2K2Lq\u007f /J6 \u0012Jjy\f2G)^jx\f.\u000e\u0017Z}x\u0010)A=\u001fMe\u00024K>Zpe\u0011\u0006Qu\u007f\f7@sljp\u0017%C6Qj\u0013\u0012Kjc\n\"['Z>B\u0017!Z6R{\u007f\u0017\u0018\u0012Jjy\u0006.Z:\\\u007fe\n/@sljp\u0017%C6Qj\u0004 ^s}\t ^s}M!Z'M"
         .length();
      char var1 = 15;
      int var7 = -1;

      label24:
      while (true) {
         byte var10000 = 27;
         String var10001 = var2.substring(++var7, var7 + var1);
         byte var10002 = -1;

         while (true) {
            String var8 = c(var10000, c(var10001));
            switch (var10002) {
               case 0:
                  var5[var3++] = var8;
                  if ((var7 += var1) >= var4) {
                     b = var5;
                     String[] var9 = b;
                     DEFAULT_VARIABLE_PREFIX = b[5];
                     VARIABLE_REASON_CODE = var9[0];
                     PREFIX_SAML_ATTR = var9[7];
                     return;
                  }

                  var1 = var2.charAt(var7);
                  break;
               default:
                  var5[var3++] = var8;
                  if ((var7 += var1) < var4) {
                     var1 = var2.charAt(var7);
                     continue label24;
                  }

                  var2 = "\u001beHFv\u001aa\u001cv\u000f\u001beHFv\tp\twJD\u001b\u0014q\r";
                  var4 = "\u001beHFv\u001aa\u001cv\u000f\u001beHFv\tp\twJD\u001b\u0014q\r".length();
                  var1 = '\t';
                  var7 = -1;
            }

            var10000 = 32;
            var10001 = var2.substring(++var7, var7 + var1);
            var10002 = 0;
         }
      }
   }

   private static char[] c(String var0) {
      char[] var10000 = var0.toCharArray();
      if (var10000.length < 2) {
         var10000[0] = (char)(var10000[0] ^ 53);
      }

      return var10000;
   }

   private static String c(int var0, char[] var1) {
      int var10003 = var1.length;
      int var10002 = var0;
      char[] var10001 = var1;
      int var10000 = var10003;

      for (int var2 = 0; var10000 > var2; var2++) {
         var10001[var2] = (char)(var10001[var2] ^ var10002 ^ switch (var2 % 7) {
            case 0 -> 72;
            case 1 -> 36;
            case 2 -> 5;
            case 3 -> 10;
            case 4 -> 120;
            case 5 -> 91;
            default -> 53;
         });
      }

      return new String(var10001).intern();
   }
}
