package com.l7tech.server.service.resolution;

import com.l7tech.gateway.common.audit.Audit;
import com.l7tech.gateway.common.audit.AuditFactory;
import com.l7tech.gateway.common.service.PublishedService;
import com.l7tech.gateway.common.transport.ResolutionConfiguration;
import com.l7tech.message.Message;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.logging.Logger;

public abstract class ServiceResolver<T> {
   protected final Logger logger = Logger.getLogger(this.getClass().getName());
   protected final Audit auditor;
   protected static final String SUFFIX_VALUE;
   protected final String PROP_BASE = this.getClass().getName();
   protected final String PROP_VALUE;
   private final String a;
   protected ServiceResolutionHelper serviceResolutionHelper;
   private static final String[] l;

   public ServiceResolver(AuditFactory var1) {
      this.PROP_VALUE = this.PROP_BASE + l[1];
      this.auditor = var1.newInstance(this, this.logger);
      this.a = this.getClass().getSimpleName();
   }

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

   public void configure(ResolutionConfiguration var1) {
   }

   public final void serviceCreated(PublishedService var1) throws ServiceResolutionException {
      List var2 = this.buildTargetValues(var1);
      this.updateServiceValues(var1, var2);
   }

   public void serviceUpdated(PublishedService var1) throws ServiceResolutionException {
   }

   public void serviceDeleted(PublishedService var1) {
   }

   public abstract Result resolve(Map<String, Object> var1, Collection<PublishedService> var2) throws ServiceResolutionException;

   public abstract void populateResolutionParameters(Message var1, Map<String, Object> var2) throws ServiceResolutionException;

   public Collection<Map<String, Object>> generateResolutionParameters(PublishedService var1, Collection<Map<String, Object>> var2) throws ServiceResolutionException {
      HashSet var3 = new HashSet<>(this.buildTargetValues(var1));

      try {
         if (var3.isEmpty()) {
            return var2;
         }
      } catch (ServiceResolutionException var10) {
         throw b(var10);
      }

      ArrayList var4 = new ArrayList(var2.size() * var3.size());

      for (Object var6 : var3) {
         for (Map var8 : var2) {
            HashMap var9 = new HashMap(var8);
            var9.put(this.PROP_VALUE, var6);
            var4.add(var9);
         }
      }

      return var4;
   }

   public abstract boolean usesMessageContent();

   protected abstract List<T> buildTargetValues(PublishedService var1) throws ServiceResolutionException;

   protected abstract void updateServiceValues(PublishedService var1, List<T> var2);

   public void setServiceResolutionHelper(ServiceResolutionHelper var1) {
      this.serviceResolutionHelper = var1;
   }

   private static ServiceResolutionException b(ServiceResolutionException var0) {
      return var0;
   }

   static {
      String[] var5 = new String[2];
      int var3 = 0;
      String var2 = "]\"\\=F&\u0006]\"\\=F&";
      int var4 = "]\"\\=F&\u0006]\"\\=F&".length();
      char var1 = 6;
      int var0 = -1;

      while (true) {
         String var10002 = a(122, c(var2.substring(++var0, var0 + var1)));
         byte var10001 = -1;
         var5[var3++] = var10002;
         if ((var0 += var1) >= var4) {
            l = var5;
            SUFFIX_VALUE = l[0];
            return;
         }

         var1 = var2.charAt(var0);
      }
   }

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

      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 -> 9;
            case 1 -> 46;
            case 2 -> 71;
            case 3 -> 43;
            case 4 -> 73;
            case 5 -> 57;
            default -> 48;
         });
      }

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