package com.l7tech.gateway.common.security.password;

import com.l7tech.objectmodel.imp.ZoneableNamedEntityImp;
import com.l7tech.security.rbac.RbacAttribute;
import com.l7tech.util.DeserializeSafe;
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.EnumType;
import jakarta.persistence.Enumerated;
import jakarta.persistence.Lob;
import jakarta.persistence.Table;
import jakarta.persistence.Transient;
import jakarta.xml.bind.annotation.XmlEnumValue;
import java.util.Date;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import org.hibernate.annotations.Proxy;

@Entity
@Proxy(lazy = false)
@Table(name = "secure_password")
@DeserializeSafe
public class SecurePassword extends ZoneableNamedEntityImp {
   private String description;
   private String encodedPassword;
   private Date lastUpdate;
   private boolean usageFromVariable;
   private SecurePassword.SecurePasswordType type;
   static final long serialVersionUID = 6041811106271593641L;

   public SecurePassword() {
   }

   public SecurePassword(String var1, long var2) {
      this.setName(var1);
      this.lastUpdate = new Date(var2);
   }

   public SecurePassword(String var1) {
      this(var1, new Date().getTime());
   }

   @RbacAttribute
   @Size(min = 1, max = 128)
   @Transient
   public String getName() {
      return super.getName();
   }

   @RbacAttribute
   @Column(name = "description", length = 256, nullable = true)
   @Size(max = 256)
   public String getDescription() {
      return this.description;
   }

   public void setDescription(String var1) {
      this.description = var1;
   }

   @RbacAttribute(displayNameIdentifier = "securePassword.usageFromVariable")
   @Column(name = "usage_from_variable")
   public boolean isUsageFromVariable() {
      return this.usageFromVariable;
   }

   public void setUsageFromVariable(boolean var1) {
      this.usageFromVariable = var1;
   }

   @Lob
   @Column(name = "encoded_password", length = 65535, nullable = false)
   @NotNull
   @Size(max = 65535)
   public String getEncodedPassword() {
      return this.encodedPassword;
   }

   public void setEncodedPassword(String var1) {
      this.encodedPassword = var1;
   }

   @Column(name = "last_update")
   public long getLastUpdate() {
      return this.lastUpdate == null ? 0L : this.lastUpdate.getTime();
   }

   public void setLastUpdate(long var1) {
      this.lastUpdate = new Date(var1);
   }

   @RbacAttribute
   @Column(name = "type", length = 64, nullable = false)
   @Enumerated(EnumType.STRING)
   @NotNull
   public SecurePassword.SecurePasswordType getType() {
      return this.type;
   }

   public void setType(SecurePassword.SecurePasswordType var1) {
      this.type = var1;
   }

   @Transient
   public Date getLastUpdateAsDate() {
      return this.lastUpdate;
   }

   public void setLastUpdateAsDate(Date var1) {
      this.lastUpdate = var1 == null ? null : new Date(var1.getTime());
   }

   public String toString() {
      return this.getName();
   }

   public boolean equals(Object var1) {
      if (this == var1) {
         return true;
      }

      if (!(var1 instanceof SecurePassword)) {
         return false;
      }

      if (!super.equals(var1)) {
         return false;
      }

      SecurePassword var2 = (SecurePassword)var1;
      if (this.usageFromVariable != var2.usageFromVariable) {
         return false;
      }

      if (this.description != null ? this.description.equals(var2.description) : var2.description == null) {
         if (this.encodedPassword != null ? this.encodedPassword.equals(var2.encodedPassword) : var2.encodedPassword == null) {
            if (this.lastUpdate != null ? this.lastUpdate.equals(var2.lastUpdate) : var2.lastUpdate == null) {
               if (this.type != null ? this.type.equals(var2.type) : var2.type == null) {
                  return this.securityZone != null ? this.securityZone.equals(var2.securityZone) : var2.securityZone == null;
               } else {
                  return false;
               }
            } else {
               return false;
            }
         } else {
            return false;
         }
      } else {
         return false;
      }
   }

   public int hashCode() {
      int var1 = super.hashCode();
      var1 = 31 * var1 + (this.description != null ? this.description.hashCode() : 0);
      var1 = 31 * var1 + (this.encodedPassword != null ? this.encodedPassword.hashCode() : 0);
      var1 = 31 * var1 + (this.lastUpdate != null ? this.lastUpdate.hashCode() : 0);
      var1 = 31 * var1 + (this.usageFromVariable ? 1 : 0);
      var1 = 31 * var1 + (this.type != null ? this.type.hashCode() : 0);
      return 31 * var1 + (this.securityZone != null ? this.securityZone.hashCode() : 0);
   }

   public enum SecurePasswordType {
      @XmlEnumValue("Password")
      PASSWORD,
      @XmlEnumValue("PEM Private Key")
      PEM_PRIVATE_KEY;

      // $VF: Failed to inline enum fields
      // 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!)
      static {
         String[] var0 = new String[2];
         int var4 = 0;
         String var3 = "i2\u0014`\u0018Mqo6\rz\u0017T}`\bi6\nl\u001fPj}";
         int var5 = "i2\u0014`\u0018Mqo6\rz\u0017T}`\bi6\nl\u001fPj}".length();
         char var2 = 15;
         int var1 = -1;

         while (true) {
            String var10002 = a(36, a(var3.substring(++var1, var1 + var2)));
            byte var10001 = -1;
            var0[var4++] = var10002;
            if ((var1 += var2) >= var5) {
               PASSWORD = new SecurePassword.SecurePasswordType();
               PEM_PRIVATE_KEY = new SecurePassword.SecurePasswordType();
               return;
            }

            var2 = var3.charAt(var1);
         }
      }

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

         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 -> 29;
               case 1 -> 83;
               case 2 -> 125;
               case 3 -> 27;
               case 4 -> 108;
               case 5 -> 59;
               default -> 28;
            });
         }

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