<?php

namespace App\Service;

use App\Cache\SocketFdBindUser;
use App\Cache\SocketUserBindFds;

/**
 * websocket关系存储
 *
 * @package App\Service
 */
class RedisService extends RedisInterface
{
    protected $prefix_fn = 'chat_fn';
    protected $prefix_user = 'chat_user';
    protected $prefix_user_info = 'userListInfo';
    /**
     * 绑定fd和用户关系
     * @param string $fid
     * @param int $userId
     * @param $run_id
     * @return void
     * @throws \RedisException
     */
    public function bind(string $fid,int $userId, $run_id = SERVER_RUN_ID)
    {
        //站点通道+用户
        $this->redis->hSet($run_id,$this->prefix_fn.$fid,$userId);
        //站点用户+通道
        $this->redis->hSet($run_id,$this->prefix_user.$userId,$fid);
    }

    /**
     * 解绑通道和用户关系
     * @param string $fid
     * @param int $userId
     * @param $run_id
     * @return void
     * @throws \RedisException
     */
    public function unbind(string $fid,int $userId, $run_id = SERVER_RUN_ID)
    {
        $this->redis->hDel($run_id,$this->prefix_fn.$fid);

        $this->redis->hDel($run_id,$this->prefix_user.$userId);
    }

    /**
     * 通过FD获取userID
     * @param string $fid
     * @param $run_id
     * @return false|\Redis|string
     * @throws \RedisException
     */
    public function findUser(string $fid, $run_id = SERVER_RUN_ID)
    {
        return $this->redis->hGet($run_id,$this->prefix_fn.$fid);
    }

    /**
     * 通过UserID 获取fd
     * @param int $userId
     * @param $run_id
     * @return false|\Redis|string
     * @throws \RedisException
     */
    public function findFd(int $userId, $run_id = SERVER_RUN_ID)
    {
        return $this->redis->hGet($run_id,$this->prefix_user.$userId);
    }

    /**
     * 存储用户信息
     * @param int $userId
     * @param array $data
     * @return void
     * @throws \RedisException
     */
    public function setUserInfo(string $userId,array $data)
    {
        $this->redis->hSet($this->prefix_user_info,$userId,json_encode($data));
    }

    /**
     * 获取用户信息
     * @param int $userId
     * @return void
     * @throws \RedisException
     */
    public function getUserInfo(string $userId)
    {
        $this->redis->hGet($this->prefix_user_info,$userId);
    }


}