package com.l7tech.identity;

import com.l7tech.objectmodel.Goid;
import com.l7tech.objectmodel.imp.PersistentEntityImp;
import com.l7tech.util.DeserializeSafe;
import com.l7tech.util.HexUtils;
import com.l7tech.util.SafeXMLDecoder;
import com.l7tech.util.SafeXMLDecoderBuilder;
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.Lob;
import jakarta.persistence.Table;
import jakarta.persistence.Transient;
import jakarta.persistence.Version;
import jakarta.xml.bind.annotation.XmlRootElement;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.text.MessageFormat;
import java.util.Map;
import java.util.TreeMap;
import org.hibernate.annotations.Proxy;
import org.hibernate.annotations.Type;

@XmlRootElement
@Entity
@Proxy(lazy = false)
@Table(name = "password_policy")
@DeserializeSafe
public class IdentityProviderPasswordPolicy extends PersistentEntityImp {
   private String propertiesXml;
   private Map<String, Object> properties = new TreeMap<>();
   private Goid internalIdentityProviderGoid;
   public static final String FORCE_PWD_CHANGE;
   public static final String NO_REPEAT_CHARS;
   public static final String MIN_PASSWORD_LENGTH;
   public static final String MAX_PASSWORD_LENGTH;
   public static final String UPPER_MIN;
   public static final String LOWER_MIN;
   public static final String NUMBER_MIN;
   public static final String SYMBOL_MIN;
   public static final String NON_NUMERIC_MIN;
   public static final String CHARACTER_DIFF_MIN;
   public static final String REPEAT_FREQUENCY;
   public static final String PASSWORD_EXPIRY;
   public static final String ALLOWABLE_CHANGES;
   static final long serialVersionUID = 5842606632406708400L;
   private static final String[] b;

   public IdentityProviderPasswordPolicy() {
   }

   public IdentityProviderPasswordPolicy(Goid var1) {
      this.setGoid(var1);
   }

   public IdentityProviderPasswordPolicy(
      boolean var1, boolean var2, int var3, int var4, int var5, int var6, int var7, int var8, int var9, int var10, int var11, int var12, boolean var13
   ) {
      if (var1) {
         String[] var14 = b;
         this.setProperty(var14[12], var1);
      }

      if (var2) {
         String[] var15 = b;
         this.setProperty(var15[41], var2);
      }

      if (var3 > 0) {
         String[] var16 = b;
         this.setProperty(var16[0], var3);
      }

      if (var4 > 0) {
         String[] var17 = b;
         this.setProperty(var17[29], var4);
      }

      if (var5 > 0) {
         String[] var18 = b;
         this.setProperty(var18[3], var5);
      }

      if (var6 > 0) {
         String[] var19 = b;
         this.setProperty(var19[36], var6);
      }

      if (var7 > 0) {
         String[] var20 = b;
         this.setProperty(var20[27], var7);
      }

      if (var8 > 0) {
         String[] var21 = b;
         this.setProperty(var21[19], var8);
      }

      if (var9 > 0) {
         String[] var22 = b;
         this.setProperty(var22[22], var9);
      }

      if (var10 > 0) {
         String[] var23 = b;
         this.setProperty(var23[33], var10);
      }

      if (var11 > 0) {
         String[] var24 = b;
         this.setProperty(var24[38], var11);
      }

      if (var12 > 0) {
         String[] var25 = b;
         this.setProperty(var25[9], var12);
      }

      if (var13) {
         this.setProperty(b[16], var13);
      }
   }

   @Column(name = "internal_identity_provider_goid")
   @Type(type = "com.l7tech.server.util.GoidType")
   public Goid getInternalIdentityProviderGoid() {
      return this.internalIdentityProviderGoid;
   }

   public void setInternalIdentityProviderGoid(Goid var1) {
      this.internalIdentityProviderGoid = var1;
   }

   @Version
   @Column(name = "version")
   public int getVersion() {
      return super.getVersion();
   }

   @Deprecated
   @Column(name = "properties", length = Integer.MAX_VALUE)
   @Lob
   public String getSerializedProps() throws IOException {
      // $VF: Couldn't be decompiled
      // Please report this to the Vineflower issue tracker, at https://github.com/Vineflower/vineflower/issues with a copy of the class file (if you have the rights to distribute it!)
      // java.lang.RuntimeException: parsing failure!
      //   at org.jetbrains.java.decompiler.modules.decompiler.decompose.DomHelper.parseGraph(DomHelper.java:211)
      //   at org.jetbrains.java.decompiler.main.rels.MethodProcessor.codeToJava(MethodProcessor.java:174)
      //
      // Bytecode:
      // 00: aload 0
      // 01: getfield com/l7tech/identity/IdentityProviderPasswordPolicy.propertiesXml Ljava/lang/String;
      // 04: ifnonnull 79
      // 07: aload 0
      // 08: getfield com/l7tech/identity/IdentityProviderPasswordPolicy.properties Ljava/util/Map;
      // 0b: invokeinterface java/util/Map.size ()I 1
      // 10: bipush 1
      // 11: if_icmpge 22
      // 14: goto 18
      // 17: athrow
      // 18: aload 0
      // 19: ldc ""
      // 1b: putfield com/l7tech/identity/IdentityProviderPasswordPolicy.propertiesXml Ljava/lang/String;
      // 1e: goto 79
      // 21: athrow
      // 22: aconst_null
      // 23: astore 1
      // 24: aconst_null
      // 25: astore 2
      // 26: new com/l7tech/util/PoolByteArrayOutputStream
      // 29: dup
      // 2a: invokespecial com/l7tech/util/PoolByteArrayOutputStream.<init> ()V
      // 2d: astore 1
      // 2e: new java/beans/XMLEncoder
      // 31: dup
      // 32: new com/l7tech/common/io/NonCloseableOutputStream
      // 35: dup
      // 36: aload 1
      // 37: invokespecial com/l7tech/common/io/NonCloseableOutputStream.<init> (Ljava/io/OutputStream;)V
      // 3a: invokespecial java/beans/XMLEncoder.<init> (Ljava/io/OutputStream;)V
      // 3d: astore 2
      // 3e: aload 2
      // 3f: aload 0
      // 40: getfield com/l7tech/identity/IdentityProviderPasswordPolicy.properties Ljava/util/Map;
      // 43: invokevirtual java/beans/XMLEncoder.writeObject (Ljava/lang/Object;)V
      // 46: aload 2
      // 47: invokevirtual java/beans/XMLEncoder.close ()V
      // 4a: aconst_null
      // 4b: astore 2
      // 4c: aload 0
      // 4d: aload 1
      // 4e: getstatic com/l7tech/util/Charsets.UTF8 Ljava/nio/charset/Charset;
      // 51: invokevirtual com/l7tech/util/PoolByteArrayOutputStream.toString (Ljava/nio/charset/Charset;)Ljava/lang/String;
      // 54: putfield com/l7tech/identity/IdentityProviderPasswordPolicy.propertiesXml Ljava/lang/String;
      // 57: aload 2
      // 58: ifnull 5f
      // 5b: aload 2
      // 5c: invokevirtual java/beans/XMLEncoder.close ()V
      // 5f: aload 1
      // 60: invokestatic com/l7tech/util/ResourceUtils.closeQuietly (Ljava/io/Closeable;)V
      // 63: goto 79
      // 66: astore 3
      // 67: aload 2
      // 68: ifnull 73
      // 6b: aload 2
      // 6c: invokevirtual java/beans/XMLEncoder.close ()V
      // 6f: goto 73
      // 72: athrow
      // 73: aload 1
      // 74: invokestatic com/l7tech/util/ResourceUtils.closeQuietly (Ljava/io/Closeable;)V
      // 77: aload 3
      // 78: athrow
      // 79: aload 0
      // 7a: getfield com/l7tech/identity/IdentityProviderPasswordPolicy.propertiesXml Ljava/lang/String;
      // 7d: areturn
      // try (3 -> 14): 14 java/io/IOException
      // try (0 -> 8): 9 java/io/IOException
      // try (19 -> 44): 51 null
      // try (52 -> 56): 57 java/io/IOException
   }

   public void setSerializedProps(String var1) {
      this.propertiesXml = var1;
      if (var1 != null && var1.length() >= 2) {
         ByteArrayInputStream var2 = new ByteArrayInputStream(HexUtils.encodeUtf8(var1));
         SafeXMLDecoder var3 = new SafeXMLDecoderBuilder(var2).build();
         this.properties = (Map<String, Object>)var3.readObject();
      } else {
         this.properties.clear();
      }
   }

   @Transient
   public Object getPropertyValue(String var1) {
      return this.properties.get(var1);
   }

   @Transient
   public Boolean getBooleanProperty(String var1) {
      Object var2 = this.properties.get(var1);
      return var2 instanceof Boolean ? (Boolean)var2 : false;
   }

   @Transient
   public Integer getIntegerProperty(String var1) {
      Object var2 = this.properties.get(var1);
      return var2 instanceof Integer ? (Integer)var2 : -1;
   }

   public void setProperty(String var1, Object var2) {
      if (var2 == null) {
         this.properties.remove(var1);
      } else {
         this.properties.put(var1, var2);
      }

      this.propertiesXml = null;
   }

   @Transient
   public Map<String, Object> getProperties() {
      return this.properties;
   }

   @Transient
   public String getDescription() {
      StringBuilder var1 = new StringBuilder();
      String[] var2 = b;
      var1.append(var2[20]);
      if (this.getIntegerProperty(var2[0]) > 0) {
         var1.append(var2[39]);
         var1.append(MessageFormat.format(var2[35], this.getIntegerProperty(var2[0])));
         var1.append(var2[7]);
      }

      var2 = b;
      if (this.getIntegerProperty(var2[29]) > 0) {
         var1.append(var2[18]);
         var1.append(MessageFormat.format(var2[21], this.getIntegerProperty(var2[29])));
         var1.append(var2[26]);
      }

      var2 = b;
      if (this.getIntegerProperty(var2[3]) > 0) {
         var1.append(var2[18]);
         var1.append(MessageFormat.format(var2[11], this.getIntegerProperty(var2[3])));
         var1.append(var2[26]);
      }

      var2 = b;
      if (this.getIntegerProperty(var2[36]) > 0) {
         var1.append(var2[18]);
         var1.append(MessageFormat.format(var2[32], this.getIntegerProperty(var2[36])));
         var1.append(var2[26]);
      }

      var2 = b;
      if (this.getIntegerProperty(var2[27]) > 0) {
         var1.append(var2[18]);
         var1.append(MessageFormat.format(var2[5], this.getIntegerProperty(var2[27])));
         var1.append(var2[26]);
      }

      var2 = b;
      if (this.getIntegerProperty(var2[19]) > 0) {
         var1.append(var2[18]);
         var1.append(MessageFormat.format(var2[30], this.getIntegerProperty(var2[19])));
         var1.append(var2[26]);
      }

      var2 = b;
      if (this.getIntegerProperty(var2[22]) > 0) {
         var1.append(var2[18]);
         var1.append(MessageFormat.format(var2[1], this.getIntegerProperty(var2[22])));
         var1.append(var2[26]);
      }

      var2 = b;
      if (this.getIntegerProperty(var2[33]) > 0) {
         var1.append(var2[18]);
         var1.append(MessageFormat.format(var2[37], this.getIntegerProperty(var2[33])));
         var1.append(var2[26]);
      }

      var2 = b;
      if (this.getBooleanProperty(var2[41])) {
         var1.append(var2[18]);
         var1.append(var2[4]);
         var1.append(var2[26]);
      }

      var2 = b;
      if (this.getIntegerProperty(var2[38]) > 0) {
         var1.append(var2[18]);
         var1.append(MessageFormat.format(var2[23], this.getIntegerProperty(var2[38])));
         var1.append(var2[26]);
      }

      var2 = b;
      if (this.getBooleanProperty(var2[16])) {
         var1.append(var2[18]);
         var1.append(var2[17]);
         var1.append(var2[26]);
      }

      var1.append(b[28]);
      return var1.toString();
   }

   public boolean hasStrengthOf(IdentityProviderPasswordPolicy var1) {
      String[] var2 = b;
      return this.hasStrengthOf(var2[40], var1)
         && this.hasStrengthOf(var2[13], var1)
         && this.hasStrengthOf(var2[24], var1)
         && this.hasStrengthOf(var2[2], var1)
         && this.hasStrengthOf(var2[14], var1)
         && this.hasStrengthOf(var2[15], var1)
         && this.hasStrengthOf(var2[6], var1)
         && this.hasStrengthOf(var2[10], var1)
         && this.hasStrengthOf(var2[25], var1)
         && this.hasStrengthOf(var2[31], var1, true)
         && this.hasStrengthOf(var2[8], var1)
         && this.hasStrengthOf(var2[34], var1)
         && this.hasStrengthOf(var2[42], var1);
   }

   private boolean hasStrengthOf(String var1, IdentityProviderPasswordPolicy var2) {
      return this.hasStrengthOf(var1, var2, false);
   }

   private boolean hasStrengthOf(String var1, IdentityProviderPasswordPolicy var2, boolean var3) {
      boolean var4 = false;
      Object var5 = this.getPropertyValue(var1);
      Object var6 = var2.getPropertyValue(var1);
      if (var5 instanceof Boolean && var6 instanceof Boolean) {
         var4 = var3 ? (Boolean)var6 || !(Boolean)var5 : !(Boolean)var6 || (Boolean)var5;
      } else if (var5 instanceof Integer && var6 instanceof Integer) {
         var4 = var3 ? (Integer)var5 <= (Integer)var6 : (Integer)var5 >= (Integer)var6;
      }

      return var6 == null || var4;
   }

   static {
      String[] var5 = new String[43];
      int var3 = 0;
      String var2 = ";&6\u0017F^,! *#kH11;0$7;x+BL,\"o#wZ\r19!u)R@:$&;gDE>$.;3B_w%\f: /\"U`68&52J\f#?(\"U`68&52J#8 x$HC,3,-3N[:v==7BL+?!?gDE>$.;3B_,\u00167;x+BL,\"o#wZ\r1#\":\"U\u0005,\u007f\u00158 \n\"WH>\"&6 dE>$.;3B_,\u0005j`4.\u0019\u000f$*(\"FY\u0019$*)2BC</\u000e&.+4PB-2\n 7N_&\u00118 6\tR@:$&;\nNC6;:5#7;x+BL,\"o#wZ\r*&?=5DL,3o;/F_>5;=5\u000f^v\u001a0 *$B}>%</(UI\u001c>.6 Bc:!\u001a+\"U\u000f5'95cD90\u00021)N@*;\u0011;. \u0017F^,! *#kH11;0\u0011;&6\u0017F^,! *#kH11;0\u00167#4(PL=:*\u001b/FC83<\b\"Ui>/I?)x$OL11&6 \u0007]>%</(UI,zo7)KT\u007f9!=gWL,%875C\r<>.6 B\r6%o(\"U@6\";=#\u0007]:$ojs\u0007E0#=+\u0004j#1y\r%65%HA\u0012?!1*R@Bj',*K\u0013c4 <>\u0019y73o(&T^(9=<gJX,\"o5\"BY\u007f7#4gHK\u007f\"'=gAB3: /.IJ\u007f$:4\"T\u0017c##f\u0018:*+4\u0007Y77!x<\u0017P\u007f5'95FN+3=+\u00118 6\tR@:$&;\nNC6;:5U?)x$OL11&6 \u0007]>%</(UI,zo9)\u0007B32o(&T^(9=<gDL18 ,gEH\u007f$*-4BI\u007f!&,/NC\u007f-\u007f%gWL,%875C\r<>.6 B\u0005,\u007f\u001a0 *$B}>%</(UI\u001c>.6 Bc:!\u001a+\"U\r8:5%B_\u0012?!1*R@\u0005j`4.\u0019\r8:5%B_\u0012?!1*R@\u0014j`-+\u0019\rcy-7#^\u0013cy',*K\u0013\u0011;. \u0017F^,! *#kH11;0!7;x+BL,\"o#wZ\r,&*;.FA\u007f5'95FN+3=p4\u000e\u000e&.+4PB-2\n 7N_&#7;x+BL,\"o#wZ\r398=5DL,3o;/F_>5;=5\u000f^v\u000f5'95cD90\u00021)N@*;\r%65%HA\u0012?!1*R@\u00177;x+BL,\"o#wZ\r<>.*&DY:$<\f: /\"U`68&52JU?)x$OL11&6 \u0007]>%</(UI,zo6\"P\r/7<+0H_;v\"-4S\r;?)>\"U\r9$ 5gHA;v?94TZ0$+x%^\r$f2x$OL-7,,\"U\u0005,\u007f\u000f$*(\"FY\u0019$*)2BC</\u0004j#1y\u00167#4(PL=:*\u001b/FC83<\b\"Ui>/";
      int var4 = ";&6\u0017F^,! *#kH11;0$7;x+BL,\"o#wZ\r19!u)R@:$&;gDE>$.;3B_w%\f: /\"U`68&52J\f#?(\"U`68&52J#8 x$HC,3,-3N[:v==7BL+?!?gDE>$.;3B_,\u00167;x+BL,\"o#wZ\r1#\":\"U\u0005,\u007f\u00158 \n\"WH>\"&6 dE>$.;3B_,\u0005j`4.\u0019\u000f$*(\"FY\u0019$*)2BC</\u000e&.+4PB-2\n 7N_&\u00118 6\tR@:$&;\nNC6;:5#7;x+BL,\"o#wZ\r*&?=5DL,3o;/F_>5;=5\u000f^v\u001a0 *$B}>%</(UI\u001c>.6 Bc:!\u001a+\"U\u000f5'95cD90\u00021)N@*;\u0011;. \u0017F^,! *#kH11;0\u0011;&6\u0017F^,! *#kH11;0\u00167#4(PL=:*\u001b/FC83<\b\"Ui>/I?)x$OL11&6 \u0007]>%</(UI,zo7)KT\u007f9!=gWL,%875C\r<>.6 B\r6%o(\"U@6\";=#\u0007]:$ojs\u0007E0#=+\u0004j#1y\r%65%HA\u0012?!1*R@Bj',*K\u0013c4 <>\u0019y73o(&T^(9=<gJX,\"o5\"BY\u007f7#4gHK\u007f\"'=gAB3: /.IJ\u007f$:4\"T\u0017c##f\u0018:*+4\u0007Y77!x<\u0017P\u007f5'95FN+3=+\u00118 6\tR@:$&;\nNC6;:5U?)x$OL11&6 \u0007]>%</(UI,zo9)\u0007B32o(&T^(9=<gDL18 ,gEH\u007f$*-4BI\u007f!&,/NC\u007f-\u007f%gWL,%875C\r<>.6 B\u0005,\u007f\u001a0 *$B}>%</(UI\u001c>.6 Bc:!\u001a+\"U\r8:5%B_\u0012?!1*R@\u0005j`4.\u0019\r8:5%B_\u0012?!1*R@\u0014j`-+\u0019\rcy-7#^\u0013cy',*K\u0013\u0011;. \u0017F^,! *#kH11;0!7;x+BL,\"o#wZ\r,&*;.FA\u007f5'95FN+3=p4\u000e\u000e&.+4PB-2\n 7N_&#7;x+BL,\"o#wZ\r398=5DL,3o;/F_>5;=5\u000f^v\u000f5'95cD90\u00021)N@*;\r%65%HA\u0012?!1*R@\u00177;x+BL,\"o#wZ\r<>.*&DY:$<\f: /\"U`68&52JU?)x$OL11&6 \u0007]>%</(UI,zo6\"P\r/7<+0H_;v\"-4S\r;?)>\"U\r9$ 5gHA;v?94TZ0$+x%^\r$f2x$OL-7,,\"U\u0005,\u007f\u000f$*(\"FY\u0019$*)2BC</\u0004j#1y\u00167#4(PL=:*\u001b/FC83<\b\"Ui>/"
         .length();
      char var1 = 17;
      int var7 = -1;

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

         while (true) {
            String var13 = a(b(var10000));
            switch (var10001) {
               case 0:
                  var5[var3++] = var13;
                  if ((var7 += var1) >= var4) {
                     b = var5;
                     String[] var9 = b;
                     UPPER_MIN = b[3];
                     NUMBER_MIN = var9[27];
                     SYMBOL_MIN = var9[19];
                     LOWER_MIN = var9[36];
                     REPEAT_FREQUENCY = var9[38];
                     MAX_PASSWORD_LENGTH = var9[29];
                     NO_REPEAT_CHARS = var9[41];
                     MIN_PASSWORD_LENGTH = var9[0];
                     CHARACTER_DIFF_MIN = var9[33];
                     PASSWORD_EXPIRY = var9[9];
                     NON_NUMERIC_MIN = var9[22];
                     FORCE_PWD_CHANGE = var9[12];
                     ALLOWABLE_CHANGES = var9[16];
                     return;
                  }

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

                  var2 = "8 \n\"WH>\"&6 dE>$.;3B_,\f#?(\"U`68&52J";
                  var4 = "8 \n\"WH>\"&6 dE>$.;3B_,\f#?(\"U`68&52J".length();
                  var1 = 21;
                  var7 = -1;
            }

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

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

      return var10000;
   }

   private static String a(char[] var0) {
      int var10002 = var0.length;
      char[] var10001 = var0;
      int var10000 = var10002;

      for (int var1 = 0; var10000 > var1; var1++) {
         var10001[var1] = (char)(var10001[var1] ^ switch (var1 % 7) {
            case 0 -> 86;
            case 1 -> 79;
            case 2 -> 88;
            case 3 -> 71;
            case 4 -> 39;
            case 5 -> 45;
            default -> 95;
         });
      }

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