using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using StackExchange.Redis;

namespace RedisStuy
{
    /// <summary>
    /// 字符串操作学习
    /// http://www.redis.cn
    /// http://www.redis.net.cn/order/
    /// </summary>
    public class RedisStringStudy
    {
        #region 初始化
        private IDatabase redisDatabase;

        public RedisStringStudy()
        {
            redisDatabase = RedisHelper.GetRedisDatabase();
        }
        #endregion

        #region 设置键值
        /// <summary>
        /// 设置指定key的值
        /// 如果Key已经存在,管是做么类型,将被重写为指定的String值。
        /// </summary>
        public bool StringSet(RedisKey key, RedisValue value, TimeSpan? expiry, When when = When.Always, CommandFlags flags = CommandFlags.None)
        {
            return redisDatabase.StringSet(key, value, expiry, when, flags);
        }

        /// <summary>
        /// 设置多组key value 的值
        /// </summary>
        public bool StringSet(KeyValuePair<RedisKey, RedisValue>[] values, When when = When.Always, CommandFlags flags = CommandFlags.None)
        {
            return redisDatabase.StringSet(values, when, flags);
        }

        /// <summary>
        /// 将给定 key 的值设为value,并返回 key 的旧值
        /// </summary>
        /// <returns> key 的旧值</returns>
        public RedisValue StringGetSet(RedisKey key, RedisValue value, CommandFlags flags = CommandFlags.None)
        {
            return redisDatabase.StringGetSet(key, value, flags);
        }
        #endregion

        #region 修改键值

        /// <summary>
        /// 用指定的字符串覆盖给定 key 所储存的字符串值,覆盖的位置从偏移量 offset 开始
        /// </summary>
        /// <returns>被修改后的字符串长度</returns>
        public RedisValue StringSetRange(RedisKey key, long offset, RedisValue value, CommandFlags flags = CommandFlags.None)
        {
            return redisDatabase.StringSetRange(key, offset,value, flags);
        }


        /// <summary>
        /// 指定内容追加内容
        /// 如果 key 已经存在并且是一个字符串,将 value 追加到 key 原来的值的末尾。
        /// 如果 key 不存在, APPEND 就简单地将给定 key 设为 value ,就像执行 SET key value 一样。
        /// </summary>
        /// <returns>
        /// 追加 value 之后, key 中字符串的长度。
        /// </returns>
        public long StringAppend(RedisKey key, RedisValue value, CommandFlags flags=CommandFlags.None)
        {
            return redisDatabase.StringAppend(key, value, flags);
        }

        /// <summary>
        /// 增加key中储存数字的整数值
        /// </summary>
        public long StringIncrement(RedisKey key, long value = 1, CommandFlags flags = CommandFlags.None)
        {
            return redisDatabase.StringIncrement(key, value, flags);
        }

        /// <summary>
        /// 增加key中储存数字的浮点值
        /// </summary>
        public double StringIncrement(RedisKey key, double value = 1, CommandFlags flags = CommandFlags.None)
        {
            return redisDatabase.StringIncrement(key, value, flags);
        }

        /// <summary>
        /// 减少key中储存数字的整数值
        /// </summary>
        /// <returns>
        /// 执行 DECR 命令之后 key 的值
        /// </returns>
        public long StringDecrement(RedisKey key, long value, CommandFlags flags = CommandFlags.None)
        {
            return redisDatabase.StringDecrement(key, value, flags);
        }

        /// <summary>
        /// 减少key中储存数字的浮点数值
        /// </summary>
        /// <returns>
        /// 执行 DECR 命令之后 key 的值
        /// </returns>
        public double StringDecrement(RedisKey key, double value, CommandFlags flags = CommandFlags.None)
        {
            return redisDatabase.StringDecrement(key, value, flags);
        }
        #endregion

        #region 读取键值

        /// <summary>
        /// 获取指定键的值
        /// </summary>
        public RedisValue StringGet(RedisKey key, CommandFlags flags = CommandFlags.None)
        {
            return redisDatabase.StringGet(key, flags);
        }

        /// <summary>
        /// 获取指定一组键的一组值
        /// </summary>
        public RedisValue[] StringGet(RedisKey[] keys, CommandFlags flags = CommandFlags.None)
        {
            return redisDatabase.StringGet(keys, flags);
        }

        /// <summary>
        /// 获取 Key 的值,并带有生存时间信息
        /// 如果 Key 不存在,则返回特殊值nil。
        /// 如果 key 的值不是字符串,则返回一个错误,因为GET只处理字符串值。
        /// </summary>
        public RedisValueWithExpiry StringGetWithExpiry(RedisKey key, CommandFlags flags = CommandFlags.None)
        {
            return redisDatabase.StringGetWithExpiry(key, flags);
        }

        /// <summary>
        /// 返回 key 中字符串值的子字符
        /// </summary>
        public RedisValue StringGetRange(RedisKey key, long start, long end, CommandFlags flags=CommandFlags.None)
        {
            return redisDatabase.StringGetRange(key, start, end, flags);
        }

        /// <summary>
        /// 获取 key 所储存的字符串值的长度
        /// </summary>
        public long StringLength(RedisKey key, CommandFlags flags=CommandFlags.None)
        {
            return  redisDatabase.StringLength(key, flags);
        }
        #endregion`

        #region 二进制一些操作,省略
        #endregion
    }
}