package com.l7tech.policy.validator;

import com.l7tech.policy.AssertionPath;
import com.l7tech.policy.PolicyValidatorResult;
import com.l7tech.policy.assertion.Assertion;
import com.l7tech.policy.assertion.AssertionUtils;
import com.l7tech.policy.assertion.IdentityTagable;
import com.l7tech.policy.assertion.IdentityTarget;
import com.l7tech.policy.assertion.IdentityTargetable;
import com.l7tech.policy.assertion.MessageTargetable;
import com.l7tech.policy.assertion.MessageTargetableSupport;
import com.l7tech.policy.assertion.RequestIdentityTargetable;
import com.l7tech.policy.assertion.TargetMessageType;
import com.l7tech.policy.assertion.identity.IdentityAssertion;
import com.l7tech.util.ArrayUtils;
import com.l7tech.util.Functions.Unary;
import java.util.Iterator;
import java.util.Set;
import java.util.TreeSet;

public class IdentityTargetableAssertionValidator implements AssertionValidator {
   private final Assertion a;
   private final String b;
   private static final String[] c;

   public IdentityTargetableAssertionValidator(Assertion var1) {
      this.a = var1;
      this.b = this.a(var1);
   }

   @Override
   public void validate(AssertionPath var1, PolicyValidationContext var2, PolicyValidatorResult var3) {
      if (this.b != null) {
         var3.addWarning(new PolicyValidatorResult.Warning(this.a, this.b, null));
      }
   }

   private String a(Assertion var1) {
      String var2 = null;
      if (var1 instanceof IdentityTargetable && ((IdentityTargetable)var1).getIdentityTarget() != null) {
         MessageTargetable var3 = new MessageTargetableSupport();
         if (!(var1 instanceof RequestIdentityTargetable)) {
            if (var1 instanceof MessageTargetable) {
               var3 = (MessageTargetable)var1;
            } else if (Assertion.isResponse(var1)) {
               var3.setTarget(TargetMessageType.RESPONSE);
            }
         }

         if (!(var1 instanceof RequestIdentityTargetable) && !this.a(var1, ValidatorFlag.REQUIRE_SIGNATURE)) {
            String[] var6 = c;
            var2 = var6[2];
         } else if (!ArrayUtils.contains(a(var1.getPath()[0], var1, var3), ((IdentityTargetable)var1).getIdentityTarget())) {
            IdentityTarget var4 = ((IdentityTargetable)var1).getIdentityTarget();
            if (var4.getTargetIdentityType() == IdentityTarget.TargetIdentityType.TAG) {
               String[] var5 = c;
               var2 = var5[3];
            } else {
               var2 = c[0];
            }
         }
      }

      return var2;
   }

   private boolean a(Assertion var1, ValidatorFlag var2) {
      boolean var3 = false;
      Unary var4 = var1.meta().get(c[1]);
      if (var4 != null) {
         Set var5 = (Set)var4.call(var1);
         var3 = var5 != null && var5.contains(var2);
      }

      return var3;
   }

   private static IdentityTarget[] a(Assertion var0, Assertion var1, MessageTargetable var2) {
      TreeSet var3 = new TreeSet();
      Iterator var4 = var0.preorderIterator();

      while (var4.hasNext()) {
         Assertion var5 = (Assertion)var4.next();
         if (var5 == var1) {
            break;
         }

         if (var5.isEnabled()) {
            if (var5 instanceof IdentityTagable && AssertionUtils.isSameTargetMessage(var5, var2) && ((IdentityTagable)var5).getIdentityTag() != null) {
               var3.add(new IdentityTarget(((IdentityTagable)var5).getIdentityTag()));
            } else if (var5 instanceof IdentityAssertion && AssertionUtils.isSameTargetMessage(var5, var2)) {
               var3.add(((IdentityAssertion)var5).getIdentityTarget());
            }
         }
      }

      return var3.toArray(new IdentityTarget[var3.size()]);
   }

   static {
      String[] var5 = new String[4];
      int var3 = 0;
      String var2 = "{\u00148\u0017xf\u001cU\tk\u0006k`\u0012_\u00138Rk|US\u0003.\u001c~{\u0001CG%\u001d~2\u0010B\u0017'\u001bi{\u0001V\u001ek\u0000oc\u0000S\u0015.\u0016*p\f\u001a\u0013#\u0017*b\u001aV\u000e(\u000b&2\u0006UG&\u0013s2\u0013[\u000e'\\*F\u001d_Gi&k`\u0012_\u0013k;nw\u001bN\u000e?\u000b(2\u0006R\b>\u001en2\u0017_G(\u001dx`\u0010Y\u0013.\u0016$\u001bJ\b'\u001bik#[\u000b\"\u0016kf\u001aH!'\u0013ma3[\u0004?\u001dxk";
      int var4 = "{\u00148\u0017xf\u001cU\tk\u0006k`\u0012_\u00138Rk|US\u0003.\u001c~{\u0001CG%\u001d~2\u0010B\u0017'\u001bi{\u0001V\u001ek\u0000oc\u0000S\u0015.\u0016*p\f\u001a\u0013#\u0017*b\u001aV\u000e(\u000b&2\u0006UG&\u0013s2\u0013[\u000e'\\*F\u001d_Gi&k`\u0012_\u0013k;nw\u001bN\u000e?\u000b(2\u0006R\b>\u001en2\u0017_G(\u001dx`\u0010Y\u0013.\u0016$\u001bJ\b'\u001bik#[\u000b\"\u0016kf\u001aH!'\u0013ma3[\u0004?\u001dxk"
         .length();
      char var1 = '|';
      int var7 = -1;

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

         while (true) {
            String var8 = a(var10000, a(var10001));
            switch (var10002) {
               case 0:
                  var5[var3++] = var8;
                  if ((var7 += var1) >= var4) {
                     c = var5;
                     return;
                  }

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

                  var2 = "|\u0013?\u0010\u007fa\u001bR\u000el\u0001lg\u0015X\u0014?Ul{RT\u0004)\u001by|\u0006DLl\u0017xaRN\t+\u001bd{\u0015\u001d\t?Ucz\u0006\u001d\u0012)\u0004x|\u0000X\u0004bUY}\u0017\u001dB\u0018\u0014\u007fr\u0017I@\u0005\u0011h{\u0006T\u00145W-f\u001aR\u0015 \u0011-w\u0017\u001d\u0003 \u0010lg\u0017YLl\u001a\u007f5\u0006U\u0005l\u0014~f\u0017O\u0014%\u001ac5\u0001U\u000f9\u0019i5\u0000X\u00119\u001c\u007fpR\\@?\u001cj{\u0013I\u0015>\u0010#f|\u0013?\u0010\u007fa\u001bR\u000el\u0001lg\u0015X\u0014?Ul{RT\u000e:\u0014a|\u0016\u001d\t(\u0010ca\u001bI\u0019`U~zRJ\t \u0019-t\u001eJ\u00015\u0006-s\u0013T\fbUY}\u0017\u001dB\u0018\u0014\u007fr\u0017I@\u0005\u0011h{\u0006T\u00145W-f\u001aR\u0015 \u0011-w\u0017\u001d\u0003#\u0007\u007fp\u0011I\u0005([";
                  var4 = "|\u0013?\u0010\u007fa\u001bR\u000el\u0001lg\u0015X\u0014?Ul{RT\u0004)\u001by|\u0006DLl\u0017xaRN\t+\u001bd{\u0015\u001d\t?Ucz\u0006\u001d\u0012)\u0004x|\u0000X\u0004bUY}\u0017\u001dB\u0018\u0014\u007fr\u0017I@\u0005\u0011h{\u0006T\u00145W-f\u001aR\u0015 \u0011-w\u0017\u001d\u0003 \u0010lg\u0017YLl\u001a\u007f5\u0006U\u0005l\u0014~f\u0017O\u0014%\u001ac5\u0001U\u000f9\u0019i5\u0000X\u00119\u001c\u007fpR\\@?\u001cj{\u0013I\u0015>\u0010#f|\u0013?\u0010\u007fa\u001bR\u000el\u0001lg\u0015X\u0014?Ul{RT\u000e:\u0014a|\u0016\u001d\t(\u0010ca\u001bI\u0019`U~zRJ\t \u0019-t\u001eJ\u00015\u0006-s\u0013T\fbUY}\u0017\u001dB\u0018\u0014\u007fr\u0017I@\u0005\u0011h{\u0006T\u00145W-f\u001aR\u0015 \u0011-w\u0017\u001d\u0003#\u0007\u007fp\u0011I\u0005(["
                     .length();
                  var1 = 145;
                  var7 = -1;
            }

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

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

      return var10000;
   }

   private static String a(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 -> 69;
            case 1 -> 24;
            case 2 -> 52;
            case 3 -> 13;
            case 4 -> 117;
            case 5 -> 109;
            default -> 10;
         });
      }

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