package com.arms.api.util.redisrepo;

import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;

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

@Component
public class RedisSetCommand {

    private final RedisTemplate<String, Object> redisTemplate;

    public RedisSetCommand(RedisTemplate<String, Object> redisTemplate) {
        this.redisTemplate = redisTemplate;
    }

    // ── 저장 ──

    /**
     * Set에 하나 이상의 멤버를 추가 (SADD)
     */
    public Long add(String key, Object... values) {
        return redisTemplate.opsForSet().add(key, values);
    }

    // ── 조회 ──

    /**
     * Set의 모든 멤버를 조회 (SMEMBERS)
     */
    public Set<Object> getAll(String key) {
        return redisTemplate.opsForSet().members(key);
    }

    /**
     * Set의 멤버 수를 조회 (SCARD)
     */
    public Long size(String key) {
        return redisTemplate.opsForSet().size(key);
    }

    /**
     * Set에 특정 멤버가 존재하는지 확인 (SISMEMBER)
     */
    public Boolean isMember(String key, Object value) {
        return redisTemplate.opsForSet().isMember(key, value);
    }

    /**
     * 랜덤 멤버를 조회 (SRANDMEMBER)
     */
    public Object getRandom(String key) {
        return redisTemplate.opsForSet().randomMember(key);
    }

    /**
     * 랜덤 멤버를 count개 조회 (SRANDMEMBER count)
     */
    public List<Object> getRandom(String key, long count) {
        return redisTemplate.opsForSet().randomMembers(key, count);
    }

    // ── 집합 연산 ──

    /**
     * 두 Set의 합집합을 조회 (SUNION)
     */
    public Set<Object> union(String key, String otherKey) {
        return redisTemplate.opsForSet().union(key, otherKey);
    }

    /**
     * 두 Set의 교집합을 조회 (SINTER)
     */
    public Set<Object> intersect(String key, String otherKey) {
        return redisTemplate.opsForSet().intersect(key, otherKey);
    }

    /**
     * 두 Set의 차집합을 조회 (SDIFF)
     */
    public Set<Object> difference(String key, String otherKey) {
        return redisTemplate.opsForSet().difference(key, otherKey);
    }

    // ── 삭제 ──

    /**
     * Set에서 하나 이상의 멤버를 삭제 (SREM)
     */
    public Long remove(String key, Object... values) {
        return redisTemplate.opsForSet().remove(key, values);
    }

    /**
     * Set에서 랜덤 멤버를 꺼냄 (SPOP)
     */
    public Object pop(String key) {
        return redisTemplate.opsForSet().pop(key);
    }

}
