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

import com.l7tech.external.assertions.gatewaygraphql.server.data.EntityDTO;
import com.l7tech.external.assertions.gatewaygraphql.server.data.IdpDTO;
import com.l7tech.external.assertions.gatewaygraphql.server.data.IdpGroupDTO;
import com.l7tech.external.assertions.gatewaygraphql.server.data.IdpUserDTO;
import com.l7tech.identity.Group;
import com.l7tech.identity.IdentityProvider;
import com.l7tech.identity.IdentityProviderConfig;
import com.l7tech.identity.User;
import com.l7tech.objectmodel.Entity;
import com.l7tech.objectmodel.EntityType;
import com.l7tech.server.search.objects.DependentEntity;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.function.Supplier;

public class EntityDTOCache {
   private final Map<EntityType, EntityDTOCache.EntityDTOSubCache> a = new ConcurrentHashMap<>();
   private final Map<EntityType, EntityDTOCache.IdpEntityDTOSubCache> b = new ConcurrentHashMap<>();
   private final Map<EntityType, EntityDTOCache.IdpEntityDTOSubCache> c = new ConcurrentHashMap<>();

   public EntityDTOCache.EntityDTOSubCache getSubCache(EntityType var1) {
      return this.a.computeIfAbsent(var1, var0 -> new EntityDTOCache.EntityDTOSubCache());
   }

   public EntityDTOCache.IdpEntityDTOSubCache getIdpSubCache(EntityType var1) {
      return this.b.computeIfAbsent(var1, var0 -> new EntityDTOCache.IdpEntityDTOSubCache());
   }

   public EntityDTOCache.IdpEntityDTOSubCache getIdpxSubCache(EntityType var1) {
      return this.c.computeIfAbsent(var1, var0 -> new EntityDTOCache.IdpEntityDTOSubCache());
   }

   public static class EntityDTOSubCache {
      private final Map<String, EntityDTO<? extends Entity>> a = new ConcurrentHashMap<>();

      public <T extends EntityDTO<? extends Entity>> T get(String var1, Supplier<EntityDTO<? extends Entity>> var2) {
         return (T)this.a.computeIfAbsent(var1, var1x -> (EntityDTO<? extends Entity>)var2.get());
      }

      public <T extends EntityDTO<? extends Entity>> T get(DependentEntity var1, Supplier<EntityDTO<? extends Entity>> var2) {
         return (T)this.a.computeIfAbsent(var1.getEntityHeader().getStrId(), var1x -> (EntityDTO<? extends Entity>)var2.get());
      }
   }

   public static class IdpEntityDTOSubCache {
      private final Map<String, IdpDTO<? extends IdentityProviderConfig, ? extends IdentityProvider>> a = new ConcurrentHashMap<>();
      private final Map<String, IdpUserDTO<? extends User, ? extends IdentityProvider>> b = new ConcurrentHashMap<>();
      private final Map<String, IdpGroupDTO<? extends Group, ? extends IdentityProvider>> c = new ConcurrentHashMap<>();

      public <T extends IdpDTO<? extends IdentityProviderConfig, ? extends IdentityProvider>> T get(
         String var1, Supplier<IdpDTO<? extends IdentityProviderConfig, ? extends IdentityProvider>> var2
      ) {
         return (T)this.a.computeIfAbsent(var1, var1x -> (IdpDTO<? extends IdentityProviderConfig, ? extends IdentityProvider>)var2.get());
      }

      public <T extends IdpUserDTO<? extends User, ? extends IdentityProvider>> T getUser(
         String var1, Supplier<IdpUserDTO<? extends User, ? extends IdentityProvider>> var2
      ) {
         return (T)this.b.computeIfAbsent(var1, var1x -> (IdpUserDTO<? extends User, ? extends IdentityProvider>)var2.get());
      }

      public <T extends IdpGroupDTO<? extends Group, ? extends IdentityProvider>> T getGroup(
         String var1, Supplier<IdpGroupDTO<? extends Group, ? extends IdentityProvider>> var2
      ) {
         return (T)this.c.computeIfAbsent(var1, var1x -> (IdpGroupDTO<? extends Group, ? extends IdentityProvider>)var2.get());
      }
   }
}
