package com.l7tech.identity;

import com.l7tech.objectmodel.Goid;
import com.l7tech.objectmodel.imp.PersistentEntityImp;
import com.l7tech.util.DeserializeSafe;
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.EnumType;
import jakarta.persistence.Enumerated;
import jakarta.persistence.Table;
import jakarta.persistence.Version;
import jakarta.xml.bind.annotation.XmlRootElement;
import org.hibernate.annotations.Proxy;
import org.hibernate.annotations.Type;

@XmlRootElement
@Proxy(lazy = false)
@Entity
@Table(name = "logon_info")
@DeserializeSafe
public class LogonInfo extends PersistentEntityImp {
   private String login;
   private Goid providerId;
   private long lastAttempted;
   private int failCount;
   private long lastActivity;
   private LogonInfo.State state = LogonInfo.State.ACTIVE;
   static final long serialVersionUID = -8792868593226038205L;

   public LogonInfo() {
      this.failCount = 0;
   }

   public LogonInfo(Goid var1, String var2) {
      this.providerId = var1;
      this.login = var2;
      this.lastAttempted = -1L;
      this.failCount = 0;
      this.lastActivity = System.currentTimeMillis();
   }

   @Column(name = "provider_goid")
   @Type(type = "com.l7tech.server.util.GoidType")
   public Goid getProviderId() {
      return this.providerId;
   }

   public void setProviderId(Goid var1) {
      this.providerId = var1;
   }

   @Column(name = "login")
   public String getLogin() {
      return this.login;
   }

   public void setLogin(String var1) {
      this.login = var1;
   }

   @Column(name = "last_attempted")
   public long getLastAttempted() {
      return this.lastAttempted;
   }

   public void setLastAttempted(long var1) {
      this.lastAttempted = var1;
   }

   @Column(name = "fail_count")
   public int getFailCount() {
      return this.failCount;
   }

   public void setFailCount(int var1) {
      this.failCount = var1;
   }

   @Column(name = "last_activity")
   public long getLastActivity() {
      return this.lastActivity;
   }

   public void setLastActivity(long var1) {
      this.lastActivity = var1;
   }

   @Column(name = "state")
   @Enumerated(EnumType.STRING)
   public LogonInfo.State getState() {
      return this.state;
   }

   public void setState(LogonInfo.State var1) {
      this.state = var1;
   }

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

   public boolean equals(Object var1) {
      if (this == var1) {
         return true;
      } else if (var1 == null || this.getClass() != var1.getClass()) {
         return false;
      } else if (!super.equals(var1)) {
         return false;
      } else {
         LogonInfo var2 = (LogonInfo)var1;
         if (this.failCount != var2.failCount) {
            return false;
         } else if (this.lastAttempted != var2.lastAttempted) {
            return false;
         } else if (this.providerId != null ? this.providerId.equals(var2.providerId) : var2.providerId == null) {
            return (this.login != null ? this.login.equals(var2.login) : var2.login == null) ? this.state == var2.state : false;
         } else {
            return false;
         }
      }
   }

   public int hashCode() {
      int var1 = super.hashCode();
      var1 = 31 * var1 + (this.login != null ? this.login.hashCode() : 0);
      var1 = 31 * var1 + (this.providerId != null ? this.providerId.hashCode() : 0);
      var1 = 31 * var1 + (int)(this.lastAttempted ^ this.lastAttempted >>> 32);
      var1 = 31 * var1 + this.failCount;
      return 31 * var1 + (this.state != null ? this.state.hashCode() : 0);
   }

   public void copy(LogonInfo var1) {
      this.providerId = var1.getProviderId();
      this.login = var1.getLogin();
      this.lastAttempted = var1.getLastAttempted();
      this.failCount = var1.getFailCount();
   }

   public void failLogonAttempt(long var1) {
      this.setLastAttempted(var1);
      this.setFailCount(this.getFailCount() + 1);
   }

   public void resetFailCount(long var1) {
      this.setLastAttempted(var1);
      this.setFailCount(0);
   }

   public enum State {
      ACTIVE,
      EXCEED_ATTEMPT,
      INACTIVE;

      // $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[3];
         int var4 = 0;
         String var3 = "5WP{U\u0010\u00161[G{]\u0004\u001d\u00061LGwF\u0011\b9AR}D\u001d\u001f5";
         int var5 = "5WP{U\u0010\u00161[G{]\u0004\u001d\u00061LGwF\u0011\b9AR}D\u001d\u001f5".length();
         char var2 = 14;
         int var1 = -1;

         while (true) {
            String var10002 = a(a(var3.substring(++var1, var1 + var2)));
            byte var10001 = -1;
            var0[var4++] = var10002;
            if ((var1 += var2) >= var5) {
               ACTIVE = new LogonInfo.State();
               EXCEED_ATTEMPT = new LogonInfo.State();
               INACTIVE = new LogonInfo.State();
               return;
            }

            var2 = var3.charAt(var1);
         }
      }

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

         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 -> 112;
               case 1 -> 15;
               case 2 -> 19;
               case 3 -> 62;
               case 4 -> 16;
               case 5 -> 84;
               default -> 73;
            });
         }

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