using Admin.Core.Common;
using Admin.Core.Extensions;
using Admin.Core.Model;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

namespace Admin.Core.Api
{
    /// <summary>
    /// 缓存监控
    /// </summary>
    [Route("api/[controller]/[action]")]
    [ApiController]
    [Authorize(Permissions.Name)]
    public class CacheController : BaseApiController
    {
        readonly IRedisBasketRepository _redisBasketRepository;

        /// <summary>
        /// 构造函数
        /// </summary>
        /// <param name="redisBasketRepository"></param>
        public CacheController(IRedisBasketRepository redisBasketRepository)
        {
            _redisBasketRepository = redisBasketRepository;
        }

        /// <summary>
        /// 获取缓存详情
        /// </summary>
        /// <returns></returns>
        [HttpPost]
        public MessageModel<PageModel<RedisKeyView>> GetList([FromBody] PageQuery<RedisKeyView> pageQuery)
        {
            var redisKeys = _redisBasketRepository.GetAllKes();

            if (pageQuery.Query.Server.IsNotEmptyOrNull())
            {
                redisKeys = redisKeys.FindAll(x => x.Server.Contains(pageQuery.Query.Server));
            }
            if (pageQuery.Query.Point.IsNotEmptyOrNull())
            {
                redisKeys = redisKeys.FindAll(x => x.Point.Contains(pageQuery.Query.Point));
            }
            if (pageQuery.Query.Key.IsNotEmptyOrNull())
            {
                redisKeys = redisKeys.FindAll(x => x.Key.Contains(pageQuery.Query.Key));
            }

            PageModel<RedisKeyView> pageModel = new PageModel<RedisKeyView>()
            {
                dataCount = redisKeys.Count,
                data = redisKeys.Skip(pageQuery.PageSize * (pageQuery.Page - 1)).Take(pageQuery.PageSize).ToList()
            };
            return Success(pageModel);
        }

        /// <summary>
        /// 获取缓存服务列表详情
        /// </summary>
        /// <returns></returns>
        [HttpGet]
        public MessageModel<List<RedisServerView>> GetServerList()
        {
            var redisKeys = _redisBasketRepository.GetAllKes();
            List<RedisServerView> redisServers = new List<RedisServerView>();
            var servers = redisKeys.Select(x => x.Server).Distinct();
            foreach (var item in servers)
            {
                RedisServerView view = new RedisServerView()
                {
                    Server = item,
                    Points = redisKeys.FindAll(x => x.Server == item).Select(m => m.Point).Distinct().ToList(),
                };
                List<Pointkey> pointkeys = new List<Pointkey>();
                foreach (var point in view.Points)
                {
                    Pointkey pointkey = new Pointkey()
                    {
                        Point = point,
                        Key = redisKeys.FindAll(x => x.Point == point).Select(m => m.Key).Distinct().ToList(),
                    };
                    pointkeys.Add(pointkey);
                }
                view.Pointkeys = pointkeys;
                redisServers.Add(view);
            }
            return Success(redisServers);
        }

        /// <summary>
        /// 获取缓存Key列表详情
        /// </summary>
        /// <returns></returns>
        [HttpGet]
        public MessageModel<PageModel<string>> GetKeyList([FromBody] PageQuery<RedisKeyView> pageQuery)
        {
            var redisKeys = _redisBasketRepository.GetAllKes();
            var keys = redisKeys.Select(x => x.Key).Distinct().ToList();
            if (pageQuery.Query.Key.IsNotEmptyOrNull())
            {
                keys = keys.FindAll(x => x.Contains(pageQuery.Query.Key));
            }

            PageModel<string> pageModel = new PageModel<string>()
            {
                dataCount = redisKeys.Count,
                data = keys.Skip(pageQuery.PageSize * (pageQuery.Page - 1)).Take(pageQuery.PageSize).ToList()
            };
            return Success(pageModel);
        }

        /// <summary>
        /// 获取基础信息
        /// </summary>
        /// <returns></returns>
        [HttpGet]
        public MessageModel<RedisBaseView> GetBaseInfo()
        {
            return Success(_redisBasketRepository.GetBaseInfo());
        }

        /// <summary>
        /// 获取缓存值
        /// </summary>
        /// <param name="key"></param>
        /// <returns></returns>
        [HttpGet]
        public async Task<MessageModel<string>> GetValue(string key)
        {
            return Success<string>(await _redisBasketRepository.GetValue(key));
        }

        /// <summary>
        /// 设置缓存
        /// </summary>
        /// <param name="key"></param>
        /// <param name="value"></param>
        /// <returns></returns>
        [HttpGet]
        public async Task<MessageModel<bool>> Add(string key, string value)
        {
            return Success(await _redisBasketRepository.SetStr(key, value));
        }

        /// <summary>
        /// 删除缓存
        /// </summary>
        /// <param name="key"></param>
        /// <returns></returns>
        [HttpGet]
        public async Task<MessageModel<bool>> Del(string key)
        {
            return Success(await _redisBasketRepository.Remove(key));
        }

        /// <summary>
        /// 清除所有缓存
        /// </summary>
        /// <returns></returns>
        [HttpGet]
        public async Task<MessageModel<string>> DelAll()
        {
            await _redisBasketRepository.Clear();
            return Success<string>("");
        }

        /// <summary>
        /// 获取节点状态
        /// </summary>
        /// <returns></returns>
        [HttpGet]
        public MessageModel<List<PointStatus>> GetPointStatus()
        {
            var list = _redisBasketRepository.GetPointStatus();
            var redisKeys = _redisBasketRepository.GetAllKes();
            list.ForEach(item =>
            {
                item.Server = redisKeys.Find(x => x.Point == item.Point)?.Server;
                item.KeyN = redisKeys.FindAll(x => x.Point == item.Point).Count;
            });

            return Success(list);
        }


    }
}