package com.l7tech.external.assertions.gatewaygraphql.server.resolver.finder;

import com.l7tech.external.assertions.gatewaygraphql.server.input.EntityInput;
import com.l7tech.objectmodel.Entity;
import com.l7tech.objectmodel.FindException;
import com.l7tech.util.ExceptionUtils;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.stream.Collectors;

public abstract class EntityAwareFinder<ET extends Entity, EI extends EntityInput> {
   private final Map<String, ET> a = new HashMap<>();
   protected boolean loaded = false;
   private static final String f;

   protected abstract Logger getLogger();

   protected abstract Collection<ET> doFindAll() throws FindException;

   protected abstract boolean matches(ET var1, EI var2);

   public ET find(EI var1) {
      this.entities();
      return this.entities().values().stream().filter(var2 -> this.matches((ET)var2, (EI)var1)).findFirst().orElse(null);
   }

   public Collection<ET> findMultiple(EI var1) {
      return this.entities().values().stream().filter(var2 -> this.matches((ET)var2, (EI)var1)).collect(Collectors.toList());
   }

   protected Map<String, ET> entities() {
      if (!this.loaded) {
         try {
            this.doFindAll().forEach(var1 -> this.a.put(var1.getId(), (ET)var1));
         } catch (Exception var2) {
            this.getLogger().log(Level.INFO, ExceptionUtils.getDebugException(var2), () -> f + ExceptionUtils.getMessageWithCause(var2));
         }

         this.loaded = true;
      }

      return this.a;
   }

   public void markCreated(ET var1) {
      this.entities().put(var1.getId(), (ET)var1);
   }

   public void markUpdated(ET var1) {
      this.entities().put(var1.getId(), (ET)var1);
   }

   public void markDeleted(ET var1) {
      this.entities().remove(var1.getId());
   }

   static {
      String var10002 = a(
         44, a("*\u0010o\u00104wl\u0001\u0001r\n(#l\u001d\u0007y_1?`\u0003\u0007=\u000e32{\u0016\u000bs\u0018f1f\u001dBi\u0017#wl\u0001\u0016t\u000b/2zUB")
      );
      byte var10001 = -1;
      f = var10002;
   }

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

      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 -> 67;
            case 1 -> 78;
            case 2 -> 49;
            case 3 -> 83;
            case 4 -> 106;
            case 5 -> 123;
            default -> 37;
         });
      }

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