package com.pannk.demo.config;

import com.alibaba.fastjson.JSON;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;

import java.util.List;
import java.util.Map;
import java.util.concurrent.TimeUnit;

/**
 * Created by wolf on 20-11-3.
 */
@Slf4j
@Component
public class RedisUtil {

    @Autowired
    private RedisTemplate<String, Object> redisTemplate;

    /**
     * 设置过期时间
     * @param key 键
     * @param time 时间,单位:秒
     * @return
     */
    public boolean expire(String key, long time) {
        try {
            if (time > 0) {
                redisTemplate.expire(key, time, TimeUnit.SECONDS);
            }
            return true;
        } catch (Exception e) {
            log.error("设置失效时间出错,{}", e);
            return false;
        }
    }

    /**
     * 设置过期时间
     * @param key 键
     * @param day 时间,单位：天
     * @return
     */
    public boolean expire(String key,int day){
        try{
            if (day<0){
                redisTemplate.expire(key,day,TimeUnit.DAYS);
            }
            return true;
        }catch (Exception e){
            log.error("设置失效时间出错,{}",e);
            return false;
        }
    }

    /**
     * 删除键
     * @param key 键
     */
    public void del(String... key){
        if (key!=null && key.length>0){
            if (key.length==1){
                redisTemplate.delete(key[0]);
            }else{
                redisTemplate.delete(CollectionUtils.arrayToList(key));
            }
        }
    }

    /**
     * 缓存获取
     * @param key 键
     * @return
     */
    public Object get(String key){
        return key == null ? null :redisTemplate.opsForValue().get(key);
    }

    /**
     * 获取对象
     * @param key 键
     * @param cls 类
     * @param <T> 类型
     * @return
     */
    public <T> T getEntity(String key,Class<T> cls){
        Object obj = this.get(key);
        if (obj!=null){
            return JSON.parseObject(obj.toString(),cls);
        }
        return null;
    }

    /**
     * 获取列表
     * @param key 键
     * @param cls 类
     * @param <T> 类型
     * @return
     */
    public <T> List<T> getListEntity(String key, Class<T> cls){
        Object obj = this.get(key);
        if (obj!=null){
            return JSON.parseArray(obj.toString(),cls);
        }
        return null;
    }

    /**
     * 设置键值
     * @param key 键
     * @param value 值
     * @return
     */
    public boolean set(String key,Object value){
        try{
            redisTemplate.opsForValue().set(key,value);
            return true;
        }catch (Exception e){
            log.error("设置键值出错,{}",e);
            return false;
        }
    }

    /**
     * 设置键值和失效时间
     * @param key 键
     * @param value 值
     * @param time 失效时间
     * @return
     */
    public boolean set(String key,Object value,long time){
        try{
            if(time>0){
                redisTemplate.opsForValue().set(key,value,time, TimeUnit.SECONDS);
            }else{
                set(key,value);
            }
            return true;
        }catch (Exception e){
            log.error("设置键值和失效时间出错,{}",e);
            return false;
        }
    }

    /**
     * 获取hash值
     * @param key 键
     * @param item 项
     * @return
     */
    public Object hget(String key,String item){
        return redisTemplate.opsForHash().get(key,item);
    }

    /**
     * 获取hashKey对应的所有键值
     * @param key 键
     * @return
     */
    public Map<Object,Object> hmget(String key){
        return redisTemplate.opsForHash().entries(key);
    }

    /**
     * 设置hash值
     * @param key 键
     * @param map 值
     * @return
     */
    public boolean hmset(String key,Map<String,Object> map){
        try{
            redisTemplate.opsForHash().putAll(key,map);
            return true;
        }catch (Exception e){
            log.error("设置哈希键值出错,{}",e);
            return false;
        }
    }
}
