package com.yahoo.sherlock.store.core;

import io.lettuce.core.Range;
import io.lettuce.core.ScoredValue;
import io.lettuce.core.ScriptOutputType;
import io.lettuce.core.cluster.api.sync.RedisClusterCommands;

import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * This class implements {@code SyncCommands} to wrap a {@code RedisClusterCommands} instance.
 *
 * @param <K> Redis primary type
 */
public class SyncCommandsClusterImpl<K> implements SyncCommands<K> {

    private final RedisClusterCommands<K, K> commands;

    /**
     * @param commands cluster commands to wrap
     */
    protected SyncCommandsClusterImpl(RedisClusterCommands<K, K> commands) {
        this.commands = commands;
    }

    @Override
    public String set(K key, K value) {
        return commands.set(key, value);
    }

    @Override
    public K get(K key) {
        return commands.get(key);
    }

    @Override
    public Long incr(K key) {
        return commands.incr(key);
    }

    @Override
    public Set<K> smembers(K key) {
        return commands.smembers(key);
    }

    @Override
    public Map<K, K> hgetall(K key) {
        return commands.hgetall(key);
    }

    @Override
    public Long zadd(K key, double score, K value) {
        return commands.zadd(key, score, value);
    }

    @Override
    public Long zrem(K key, K... values) {
        return commands.zrem(key, values);
    }

    @Override
    public Long del(K... keys) {
        return commands.del(keys);
    }

    @Override
    public List<ScoredValue<K>> zrangeWithScores(K key, long start, long end) {
        return commands.zrangeWithScores(key, start, end);
    }

    @Override
    public <N extends Number> Long zcount(K key, Range<N> range) {
        return commands.zcount(key, range);
    }

    @Override
    public <T> T eval(String script, ScriptOutputType type, K[] keys, K... values) {
        return commands.eval(script, type, keys, values);
    }

    @Override
    public Boolean expire(K key, long seconds) {
        return commands.expire(key, seconds);
    }

    @Override
    public void close() throws Exception {

    }

    @Override
    public String bgsave() {
        return commands.bgsave();
    }

}