package com.l7tech.server.extension.provider.sharedstate.counter;

import com.ca.apim.gateway.extension.sharedstate.counter.CounterFieldOfInterest;
import com.ca.apim.gateway.extension.sharedstate.counter.SharedCounterState;
import com.ca.apim.gateway.extension.sharedstate.counter.exception.CounterLimitReachedException;
import com.l7tech.server.sla.CounterInfo;
import java.time.Clock;
import java.time.Instant;
import java.time.ZoneOffset;
import java.time.ZonedDateTime;
import java.time.temporal.ChronoUnit;
import java.util.Collection;
import java.util.Collections;
import java.util.Date;
import java.util.EnumMap;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.stream.Collectors;
import java.util.stream.Stream;

public class Counter {
   private String a;
   private long b;
   private final EnumMap<CounterFieldOfInterest, Long> c = new EnumMap<>(CounterFieldOfInterest.class);
   private static final Collection<CounterFieldOfInterest> d;
   private static final Logger e;
   private static final String[] f;

   public Counter() {
      for (CounterFieldOfInterest var2 : d) {
         this.c.put(var2, 0L);
      }

      this.b = Clock.systemUTC().millis();
   }

   public Counter(String var1) {
      this();
      this.a = var1;
   }

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

   public void setName(String var1) {
      this.a = var1;
   }

   public long getLastUpdate() {
      return this.b;
   }

   public void setLastUpdate(long var1) {
      this.b = var1;
   }

   public long getCounterField(CounterFieldOfInterest var1) {
      return this.c.get(var1);
   }

   public void setCounterField(CounterFieldOfInterest var1, long var2) {
      this.c.put(var1, var2);
   }

   private boolean a(CounterFieldOfInterest var1, long var2, long var4) {
      try {
         if (this.getCounterField(var1) + var2 > var4) {
            return true;
         }
      } catch (ArithmeticException var6) {
         throw a(var6);
      }

      return false;
   }

   public void updateCounter(long var1, long var3) {
      this.b(var1);

      for (CounterFieldOfInterest var6 : d) {
         this.a(var6, var3);
      }

      this.b = var1;
   }

   public void updateCounterWithoutExceedingLimit(CounterFieldOfInterest var1, long var2, long var4, long var6) throws CounterLimitReachedException {
      try {
         this.b(var2);
         if (this.a(var1, var4, var6)) {
            throw new CounterLimitReachedException(f[2] + this.a);
         }
      } catch (CounterLimitReachedException var10) {
         throw a(var10);
      }

      for (CounterFieldOfInterest var9 : d) {
         this.a(var9, var4);
      }

      this.b = var2;
   }

   private void a(CounterFieldOfInterest var1, long var2) {
      try {
         this.setCounterField(var1, Math.addExact(this.getCounterField(var1), var2));
      } catch (ArithmeticException var5) {
         this.a(var1);
      }
   }

   private void a(CounterFieldOfInterest var1) {
      e.log(Level.WARNING, f[4], new Object[]{this.a, var1.getName()});
   }

   private ZonedDateTime a(long var1) {
      return ZonedDateTime.ofInstant(Instant.ofEpochMilli(var1), ZoneOffset.systemDefault());
   }

   private void b(long var1) {
      try {
         if (!this.a(this.a(var1))) {
            this.setCounterField(CounterFieldOfInterest.SEC, 0L);
         }
      } catch (ArithmeticException var5) {
         throw a(var5);
      }

      try {
         if (!this.b(this.a(var1))) {
            this.setCounterField(CounterFieldOfInterest.MIN, 0L);
         }
      } catch (ArithmeticException var7) {
         throw a(var7);
      }

      try {
         if (!this.c(this.a(var1))) {
            this.setCounterField(CounterFieldOfInterest.HOUR, 0L);
         }
      } catch (ArithmeticException var4) {
         throw a(var4);
      }

      try {
         if (!this.d(this.a(var1))) {
            this.setCounterField(CounterFieldOfInterest.DAY, 0L);
         }
      } catch (ArithmeticException var6) {
         throw a(var6);
      }

      try {
         if (!this.e(this.a(var1))) {
            this.setCounterField(CounterFieldOfInterest.MONTH, 0L);
         }
      } catch (ArithmeticException var3) {
         throw a(var3);
      }
   }

   private boolean a(ZonedDateTime var1) {
      return this.a(this.b).truncatedTo(ChronoUnit.SECONDS).equals(var1.truncatedTo(ChronoUnit.SECONDS));
   }

   private boolean b(ZonedDateTime var1) {
      return this.a(this.b).truncatedTo(ChronoUnit.MINUTES).equals(var1.truncatedTo(ChronoUnit.MINUTES));
   }

   private boolean c(ZonedDateTime var1) {
      return this.a(this.b).truncatedTo(ChronoUnit.HOURS).equals(var1.truncatedTo(ChronoUnit.HOURS));
   }

   private boolean d(ZonedDateTime var1) {
      return this.a(this.b).truncatedTo(ChronoUnit.DAYS).equals(var1.truncatedTo(ChronoUnit.DAYS));
   }

   private boolean e(ZonedDateTime param1) {
      // $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: aload 0
      // 02: getfield com/l7tech/server/extension/provider/sharedstate/counter/Counter.b J
      // 05: invokevirtual com/l7tech/server/extension/provider/sharedstate/counter/Counter.a (J)Ljava/time/ZonedDateTime;
      // 08: invokevirtual java/time/ZonedDateTime.getYear ()I
      // 0b: aload 1
      // 0c: invokevirtual java/time/ZonedDateTime.getYear ()I
      // 0f: if_icmpne 33
      // 12: aload 0
      // 13: aload 0
      // 14: getfield com/l7tech/server/extension/provider/sharedstate/counter/Counter.b J
      // 17: invokevirtual com/l7tech/server/extension/provider/sharedstate/counter/Counter.a (J)Ljava/time/ZonedDateTime;
      // 1a: invokevirtual java/time/ZonedDateTime.getMonthValue ()I
      // 1d: aload 1
      // 1e: invokevirtual java/time/ZonedDateTime.getMonthValue ()I
      // 21: if_icmpne 33
      // 24: goto 2b
      // 27: invokestatic com/l7tech/server/extension/provider/sharedstate/counter/Counter.a (Ljava/lang/Exception;)Ljava/lang/Exception;
      // 2a: athrow
      // 2b: bipush 1
      // 2c: goto 34
      // 2f: invokestatic com/l7tech/server/extension/provider/sharedstate/counter/Counter.a (Ljava/lang/Exception;)Ljava/lang/Exception;
      // 32: athrow
      // 33: bipush 0
      // 34: ireturn
      // try (0 -> 16): 17 java/lang/ArithmeticException
      // try (8 -> 21): 21 java/lang/ArithmeticException
   }

   public Map<CounterFieldOfInterest, Long> toMap() {
      return new EnumMap<>(this.c);
   }

   public SharedCounterState toCounterState() {
      return new CounterInfo(this.a, this.toMap(), new Date(this.b));
   }

   @Override
   public String toString() {
      String var10000 = this.a;
      long var10001 = this.b;
      String var1 = String.valueOf(this.c);
      long var2 = var10001;
      String var4 = var10000;
      String[] var5 = f;
      return var5[3] + var4 + var5[0] + var2 + var5[1] + var1 + "}";
   }

   static {
      String[] var5 = new String[5];
      int var3 = 0;
      String var2 = "H5u9BZ\u0018:i14WLQ\u0006C984S\u0014\u001a#p8<W\t\u001e\nx6=FML\tv'u@F\u0019\u0001m0'\u0003";
      int var4 = "H5u9BZ\u0018:i14WLQ\u0006C984S\u0014\u001a#p8<W\t\u001e\nx6=FML\tv'u@F\u0019\u0001m0'\u0003".length();
      char var1 = 14;
      int var7 = -1;

      label24:
      while (true) {
         byte var10000 = 59;
         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) {
                     f = var5;
                     d = Collections.unmodifiableList(Stream.of(CounterFieldOfInterest.values()).filter(var0 -> {
                        try {
                           if (var0 != CounterFieldOfInterest.NONE) {
                              return true;
                           }
                        } catch (ArithmeticException var1x) {
                           throw a(var1x);
                        }

                        return false;
                     }).collect(Collectors.toList()));
                     e = Logger.getLogger(Counter.class.getName());
                     return;
                  }

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

                  var2 = "?e3(D_\r\u0007d'+U\u0007Xh?e3(D_\r\\qv;\u0010R\u001e\u000f*4#QY\u0017\u0019nf2X__\u001ee3(T[\r\u0005*0'\\O\u001a\\l)4\u0010N\u0017\u0019*=wM\u001a\u0019\u0015o*\"\u001e\u001a<\u0013\u007f(2UH_\nk*3U\u001a\b\u0015f*f^U\u000b\\i.'^]\u001a\\k(?\u0010\\\n\u000e~.#B\u0014";
                  var4 = "?e3(D_\r\u0007d'+U\u0007Xh?e3(D_\r\\qv;\u0010R\u001e\u000f*4#QY\u0017\u0019nf2X__\u001ee3(T[\r\u0005*0'\\O\u001a\\l)4\u0010N\u0017\u0019*=wM\u001a\u0019\u0015o*\"\u001e\u001a<\u0013\u007f(2UH_\nk*3U\u001a\b\u0015f*f^U\u000b\\i.'^]\u001a\\k(?\u0010\\\n\u000e~.#B\u0014"
                     .length();
                  var1 = 14;
                  var7 = -1;
            }

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

   private static Exception a(Exception var0) {
      return var0;
   }

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

      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 -> 84;
            case 1 -> 34;
            case 2 -> 110;
            case 3 -> 110;
            case 4 -> 24;
            case 5 -> 18;
            default -> 87;
         });
      }

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