package com.zanxiang.game.module.sdk.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.zanxiang.game.module.mybatis.entity.GameExt;
import com.zanxiang.game.module.mybatis.entity.UserToken;
import com.zanxiang.game.module.sdk.pojo.dto.UserTokenDTO;
import com.zanxiang.game.module.sdk.pojo.param.UserData;
import com.zanxiang.game.module.sdk.pojo.vo.CpTokenCheckVO;
import com.zanxiang.module.util.pojo.ResultVO;
import reactor.util.function.Tuple2;

/**
 * @author : lingfeng
 * @time : 2022-06-08
 * @description : 用户token管理
 */
public interface IUserTokenService extends IService<UserToken> {

    /**
     * cp令牌检查
     *
     * @param appId  应用程序id
     * @param userId 用户id
     * @param token  令牌
     * @param sign   标志
     * @return {@link ResultVO}<{@link CpTokenCheckVO}>
     */
    ResultVO<CpTokenCheckVO> cpTokenCheckNew(String appId, Long userId, String token, String sign);

    /**
     * cp令牌检查
     *
     * @param appId  应用程序id
     * @param userId 用户id
     * @param token  令牌
     * @param sign   标志
     * @return {@link ResultVO}<{@link Long}>
     */
    ResultVO<Long> cpTokenCheck(String appId, Long userId, String token, String sign);

    /**
     * CP服务端加密方法
     *
     * @param gameExt : 游戏信息
     * @param userId  : 玩家id
     * @param token   : 令牌
     * @return
     */
    Tuple2<String, String> getMySign(GameExt gameExt, Long userId, String token);

    /**
     * 获取玩家token
     *
     * @param userId : 玩家id
     * @param token  : 令牌
     * @return : 返回token信息
     */
    UserToken getCheckUserToken(Long userId, String token);

    /**
     * 用户活跃token更新
     *
     * @param userData 用户数据
     */
    void userTokenUpdateCheck(UserData userData);

    /**
     * 用户令牌到期时间检查
     *
     * @param userData 用户数据
     * @return {@link Boolean}
     */
    Boolean userTokenExpireTimeCheck(UserData userData);

    /**
     * 被标记设备令牌信息
     *
     * @param token      令牌
     * @param deviceType 设备类型
     * @return {@link UserTokenDTO}
     */
    UserTokenDTO getTokenInfoByTokenDevice(String token, Integer deviceType);

    /**
     * 获取用户令牌
     *
     * @param userId     用户id
     * @param deviceType 设备类型
     * @return {@link String}
     */
    String getUserToken(Long userId, Integer deviceType);

    /**
     * 删除用户令牌
     *
     * @param userId     用户id
     * @param deviceType 设备类型
     */
    void deleteUserToken(Long userId, Integer deviceType);
}
