package org.infinispan.client.hotrod;

import java.net.SocketAddress;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;

import org.infinispan.client.hotrod.test.MultiHotRodServersTest;
import org.infinispan.configuration.cache.CacheMode;
import org.infinispan.configuration.cache.ConfigurationBuilder;
import org.infinispan.server.hotrod.test.HotRodTestingUtil;

/**
 * @author gustavonalle
 * @since 8.0
 */
public abstract class BaseSegmentOwnershipTest extends MultiHotRodServersTest {

   static final int NUM_SEGMENTS = 20;
   static final int NUM_OWNERS = 2;
   static final int NUM_SERVERS = 3;

   protected Map<Integer, Set<SocketAddress>> invertMap(Map<SocketAddress, Set<Integer>> segmentsByServer) {
      Map<Integer, Set<SocketAddress>> serversBySegment = new HashMap<>();
      for (Map.Entry<SocketAddress, Set<Integer>> entry : segmentsByServer.entrySet()) {
         for (Integer seg : entry.getValue()) {
            serversBySegment.computeIfAbsent(seg, v -> new HashSet<>()).add(entry.getKey());
         }
      }
      return serversBySegment;
   }

   protected abstract CacheMode getCacheMode();

   protected ConfigurationBuilder getCacheConfiguration() {
      ConfigurationBuilder builder = getDefaultClusteredCacheConfig(getCacheMode(), false);
      builder.clustering().hash().numOwners(NUM_OWNERS).numSegments(NUM_SEGMENTS);
      return HotRodTestingUtil.hotRodCacheConfiguration(builder);
   }

   @Override
   protected void createCacheManagers() throws Throwable {
      createHotRodServers(NUM_SERVERS, getCacheConfiguration());
   }

   @Override
   protected org.infinispan.client.hotrod.configuration.ConfigurationBuilder createHotRodClientConfigurationBuilder(String host, int serverPort) {
      return super.createHotRodClientConfigurationBuilder(host, serverPort);
   }

}
