namespace WIDESEAWCS_SignalR;
/// 
/// 
/// 
//[Authorize]
[MapHub("/hubs/simple")]
public class SimpleHub : Hub
{
    private readonly ICacheService _simpleCacheService;
    public SimpleHub(ICacheService simpleCacheService)
    {
        _simpleCacheService = simpleCacheService;
    }
    /// 
    /// 连接
    /// 
    /// 
    public override async Task OnConnectedAsync()
    {
        var token = Context.GetHttpContext().Request.Query["access_token"];//获取token
        if (!string.IsNullOrEmpty(token))
        {
            var userIdentifier = Context.UserIdentifier;//自定义的Id
            UpdateRedis(userIdentifier, token);//更新redis
        }
    }
    /// 
    /// 断开连接
    /// 
    /// 
    /// 
    public override async Task OnDisconnectedAsync(Exception? exception)
    {
        var userIdentifier = Context.UserIdentifier;//自定义的Id
        UpdateRedis(userIdentifier, null, false);//更新redis
        await base.OnDisconnectedAsync(exception);
    }
    /// 
    /// 退出登录
    /// 
    /// 
    /// 
    public async Task LoginOut(string userId)
    {
        await Clients.User(userId).LoginOut("退出登录");
    }
    #region 方法
    /// 
    /// 更新redis
    /// 
    /// 用户id
    /// token
    /// 是否是上线
    private void UpdateRedis(string userIdentifier, string token, bool ifConnect = true)
    {
        var userId = userIdentifier.Split("_")[0];//分割取第一个
        if (!string.IsNullOrEmpty(userId))
        {
            //获取缓存当前用户的token信息列表
            var tokenInfos = _simpleCacheService.Get>("Cache_UserToken");
            if (tokenInfos != null)
            {
                if (ifConnect)
                {
                    //获取redis中当前token
                    var tokenInfo = tokenInfos.Where(it => it.Token == token).FirstOrDefault();
                    if (tokenInfo != null)
                    {
                        tokenInfos.Remove(tokenInfo);//删除原来的(一个用户只能有一个token)
                        tokenInfo.Token_ID = userIdentifier;//添加到客户端列表
                        tokenInfo.Token = token;//添加到客户端列表
                        tokenInfo.UserId = userId.ToInt32(); //添加到客户端列表
                        tokenInfos.Add(tokenInfo);
                        _simpleCacheService.Remove("Cache_UserToken");//删除Redis
                        _simpleCacheService.AddObject("Cache_UserToken", tokenInfos);//更新Redis
                    }
                    else
                    {
                        tokenInfos.Add(new UserInfo() { Token = token, Token_ID = userIdentifier ,UserId = userId.ToInt32() });
                        _simpleCacheService.AddObject("Cache_UserToken", tokenInfos);//更新Redis
                    }
                }
                else
                {
                    //获取当前客户端ID所在的token信息
                    var tokenInfo = tokenInfos.Where(it => it.Token == token).FirstOrDefault();
                    if (tokenInfo != null)
                    {
                        tokenInfos.Remove(tokenInfo);//删除原来的(一个用户只能有一个token)
                        _simpleCacheService.Remove("Cache_UserToken");//删除Redis
                        _simpleCacheService.AddObject("Cache_UserToken", tokenInfos);//更新Redis
                    }
                }
            }
            else
            {
                if (ifConnect)
                {
                    tokenInfos = new List
                    {
                        new UserInfo() { Token = token, Token_ID = userIdentifier ,UserId = userId.ToInt32()  }
                    };
                    _simpleCacheService.AddObject("Cache_UserToken", tokenInfos);//更新Redis
                }
            }
        }
    }
    #endregion 方法
}