using Microsoft.AspNetCore.SignalR;
using OASystem.API.OAMethodLib.Hub.HubClients;
using OASystem.API.OAMethodLib.SignalR.Hubs;
using OASystem.API.OAMethodLib.SignalR.HubService;
using System.DirectoryServices.Protocols;
using System.Text.RegularExpressions;
using static OASystem.API.OAMethodLib.Hub.Hubs.ChatHub;
using static OASystem.API.OAMethodLib.JWTHelper;

namespace OASystem.API.OAMethodLib.Hub.Hubs
{
    public class ChatHub : Hub<IChatClient>
    {
        private readonly ILogger<ChatHub> _logger;
        private readonly IHttpContextAccessor _accessor;
        private readonly CommonService _common;

            /// <summary>
           /// 已登录的用户信息
           /// </summary>
           public static List<UserModel> OnlineUser { get; set; } = new List<UserModel>();

        public ChatHub(ILogger<ChatHub> logger, CommonService common, IHttpContextAccessor accessor)
        {
            _logger = logger;
            _common = common;
            _accessor = accessor;
        }

        /// <summary>
        /// SignalR登录验证
        /// </summary>
        public async Task SignalRLogin(int userId)
        {
            string connid = Context.ConnectionId;
            bool status = false;
            if (!OnlineUser.Exists(u => u.ConnectionId == connid))
            {
                status = true;
                OnlineUser.Add( new UserModel() { UserId = userId,ConnectionId = connid,GroupName = "FMGJ-OASystem" });

            }
            //给当前连接返回消息
            await Clients.Client(connid).SendAsync("SignalRLoginResponse", status);
        }

        /// <summary>
        /// 客户端连接服务端
        /// </summary>
        /// <returns></returns>
        public override Task OnConnectedAsync()
        {
            var id = Context.ConnectionId;
            _logger.LogInformation($"Client ConnectionId=> [[{id}]] Already Connection Server!");

            //验证Token
            //var token = _accessor.HttpContext.Request.Query["access_token"];
            //var user = JwtHelper.SerializeJwt(token);


            return base.OnConnectedAsync();
        }

        /// <summary>
        /// 客户端断开连接
        /// </summary>
        /// <param name="exception"></param>
        /// <returns></returns>
        public override Task OnDisconnectedAsync(Exception exception)
        {
            var id = Context.ConnectionId;
            _logger.LogInformation($"Client ConnectionId=> [[{id}]] Already Close Connection Server!");
            return base.OnDisconnectedAsync(exception);
        }

       

        /**
         * 测试 
         * */
        /// <summary>
        /// 给所有客户端发送消息
        /// </summary>
        /// <returns></returns>
        public async Task SendMessage(string data)
        {
            Console.WriteLine("Have one Data!");
            await Clients.All.SendAll(_common.SendAll(data));
        }


        public class UserModel
        {
            public int UserId { get; set; }

            public string ConnectionId { get; set; }

            public string GroupName { get; set; }
        }
    }
}