package org.infinispan.jcache.remote;

import java.util.Set;

import org.infinispan.client.hotrod.RemoteCache;
import org.infinispan.client.hotrod.VersionedValue;
import org.infinispan.commons.util.CloseableIterator;

/**
 * Wrapper which emulates replace and remove with oldValue.
 */
class RemoteCacheWithOldValue<K, V> extends RemoteCacheWrapper<K, V> {
   public RemoteCacheWithOldValue(RemoteCache<K, V> delegate) {
      super(delegate);
   }

   @Override
   public boolean remove(Object key, Object oldValue) {
      @SuppressWarnings("unchecked")
      K k = (K) key;

      VersionedValue<V> versioned = delegate.getWithMetadata(k);
      if (versioned == null) {
         return false;
      }
      if (!oldValue.equals(versioned.getValue())) {
         return false;
      }
      return delegate.removeWithVersion(k, versioned.getVersion());
   }

   @Override
   public boolean replace(K key, V oldValue, V newValue) {
      VersionedValue<V> versioned = delegate.getWithMetadata(key);
      if (versioned == null) {
         return false;
      }
      if (!oldValue.equals(versioned.getValue())) {
         return false;
      }
      return delegate.replaceWithVersion(key, newValue, versioned.getVersion());
   }

   @Override
   public CloseableIterator<Entry<Object, Object>> retrieveEntries(String filterConverterFactory, Set<Integer> segments, int batchSize) {
      return delegate.retrieveEntries(filterConverterFactory, segments, batchSize);
   }
}
