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

// https://github.com/StackExchange/StackExchange.Redis/
// https://stackexchange.github.io/StackExchange.Redis/
// https://stackexchange.github.io/StackExchange.Redis/Basics
// https://redis.io/download#installation

namespace TopNugetPackages
{
    public class MainRedisDriver : IDisposable
    {
        private ConnectionMultiplexer redis;

        public MainRedisDriver()
        {
            redis = ConnectionMultiplexer.Connect("localhost");     // default port 6379
        }

        public void Dispose()
        {
            redis.Dispose();
        }

        public void TestRedisCache()
        {
            IDatabase db = redis.GetDatabase();
            string keyname = "KEYNAME1";
            string keyvalue = "TimHsu1";

            db.StringSet(keyname, keyvalue);

            var value = db.StringGet(keyname);
            Console.WriteLine($"GOT REDIS KEY:[{keyname}] VALUE:[{value}]");

            db.KeyDelete(keyname);
        }

        // Need Debug, wait, then works
        public async Task<bool> TestRedisCacheAsync()
        {
            IDatabase db = redis.GetDatabase();
            string keyname = "KEYNAME2";
            string keyvalue = "TimHsu2";

            await db.StringSetAsync(keyname, keyvalue);
            await Task.Delay(100);

            var value = await db.StringGetAsync(keyname);
            Console.WriteLine($"GOT REDIS ASYNC KEY:[{keyname}] VALUE:[{value}]");

            db.KeyDelete(keyname);

            return true;
        }

        // Need Debug, wait, then works
        public void TestRedisPubSub()
        {
            ISubscriber sub = redis.GetSubscriber();
            string channel = "CHANNEL1";
            string message = "HELLO WORLD";

            // Synchronous handler
            sub.Subscribe(channel).OnMessage(channelMessage =>
            {
                var msg = (string)channelMessage.Message;
                Console.WriteLine($"GOT PUB/SUB msg: {msg}");
            });

            //// Asynchronous handler
            //sub.Subscribe(channel).OnMessage(async channelMessage =>
            //{
            //    await Task.Delay(100);

            //    var msg = (string)channelMessage.Message;
            //    Console.WriteLine($"GOT PUB/SUB msg: {msg}");
            //});

            // ADD DEBUG BREAK HERE
            sub.Publish(channel, message);
        }
    }
}