package com.ssj.framework.core.security.manager;

import java.util.List;
import java.util.Map;

/**
 * 
 * 类名称：TokenManager<br>
 * 类描述：令牌管理器<br>
 * 创建时间：2015年10月27日 上午11:05:22<br>
 * @version v1.0
 *
 */
public interface TokenManager {
	/**
	 * 获取实体
	* @param key
	* @param clazz
	* 2017年12月1日 上午10:26:29 
	* @T
	 */
	 public  <T> T get(String key,Class<T> clazz);
	 
	 /**
     * 获取集合
      * @param key
     * @param clazz
     * @param <T>
     * @return
     */
	 public  <T> List<T> getList(String key, Class<T> clazz);
	 /**
	  * 存放实体
	 * @param key
	 * @param value
	 * @param expireSeconds
	 * 2017年12月1日 上午10:26:36 
	 * @String
	  */
	 public String set(String key, Object  value, int expireSeconds);
     public String setAt(String key, long expireUnitTime,  Object  value);
	 public String set(String key, Object  value);
    public Long setnx(String key, String  value);
	   public void hset(String key, Map<String, String> value);
	   public void hset(String key, Map<String, String> value, int expireSeconds) ;
	   public Map<String, String> hget(String key) ;
	   /**
	    * 存放String类型
	    */
	   public String setString(String key,String value, int expireSeconds);
	   public String setString(String key,String value);
	   public void delString(String key);
	   public void batchDel(String key);
	   public String getString(String key);

    public boolean exists(String key);
    /**
     * 创建令牌
     * @param userId
     * @param openId
     * @param source
     * @return
     */
    public String createToken(String token,String userId,String type);
    public String createToken(String token,String userId,int seconds,String type);
    public String createToken(String token,String userId, String openId, int source,String sessionKey,String type);
    public String createToken(String token,String userId, String openId, int source,String sessionKey,int seconds,String type);

    /**
     * 移除令牌
     * @param token
     */
    public void removeToken(String token);
    public void removeToken(String token,String type);
    /**
     * 移除令牌
     * @param token
     */
    public void removeToken(String token,String replaceUserId,String replaceOpenId,String type);

    /**
     * 检查令牌
     * @param token
     * @return
     */
    public boolean checkToken(String token);

    /**
     * 检查令牌
     * @param token
     * @param userId
     * @return
     */
    public boolean checkToken(String token, String userId);

    /**
     * 通过token获取用户id
     * @param token
     * @return
     */
    public String getUserId(String token);
    /**
     * 通过用户id，获取token
     * @param token
     * @return
     */
    public List<String> getToken(String userId);
    /**
     * 
     * @param userId
     * @param type  WX,APP,PC
     * @return
     */
    public String getToken(String userId,String type);
    /**
     * 通过token获取用户openid
     * @param token
     * @return
     */
    public String getOpenId(String token);
    
    
    /**
     * 通过token获取用户sessionKey
     * @param token
     * @return
     */
    public String getSessionKey(String token);


   
    
    /**
     *  创建私塾家微信公众号的accessToken
     */
    public String createSSJAccessToken(String wxToken,int seconds);
    /**
     *  创建私塾家微信公众号的JSaccessToken
     */
    public String createSSJJSAccessToken(String wxToken,int seconds);
    /**
     * 根据私塾家微信公众号openId设置是否关注
     * @param openId
     * @param seconds
     * @return
     */
    public String createSSJOpenId(String openId,String subscribe );
    /**
     * 获取私塾家微信公众号的accessToken
     * @return
     */
    public String getSSJAccessToken();
    /**
     * 获取私塾家微信公众号的JSaccessToken
     * @return
     */
    public String getSSJJSAccessToken();
  
    
    /**
     * 根据openId设置是否关注
     * @param openId
     * @param seconds
     * @return
     */
    public String createWxOpenId(String openId,String subscribe );
    
    /**
     * 根据openId查询是否关注
     * @param openId
     * @param seconds
     * @return
     */
    public String getWxOpenId(String openId);
    
    /**
     * 查询城市天气
     * @Title: getLibWeather
     * @param @param libKey
     * @param @return    设定文件
     * @return String    返回类型
     * @author shenhao
     * @date 2017年8月7日 下午5:00:16
     * @throws
     */
    public String getLibWeather(String libKey,String city);
    
    
    
    /**
     * 存储pos机支付订单明细信息
     * 2017年9月25日11:13:28
     * wuwen
     * 
     */
    public String createPayOrderData(String orderNo,String orderdata );
    
    /**
     * 查询pos机支付订单明细信息
     * 2017年9月25日11:13:36
     * wuwen
     */
    public String getPayOrderData(String orderNo);
    
    /**
     * 查询周末卡当前位置id
     * 2017年11月8日15:44:21
     * wuwen
     */
    public String getCurWeekendVipCode();
    
    /**
     * 设置周末卡当前位置id
     * 2017年11月8日15:44:21
     * wuwen
     */
    public String createCurWeekendVipCode(String  vipCode);
    /**
     *  设置用户是不是管理员 1是，0失效
    * 2017年11月30日 下午2:42:14 
    * @String
     */
    public String createManageType(String userId,String type);
    /**
     * 删除用户
    * @param userId
    * @return
    * 创建人：ZhangCaibao 
    * 2017年11月30日 下午2:58:56 
    * @String
     */
    public void deleteManageType(String userId);
    /**
     *  获取用户是不是管理员 1是，0失效
    * 2017年11月30日 下午2:42:14 
    * @String
     */
    public String  getManageType(String userId);
    
    
    /**
     *  设置会员对应馆的服务。 >0有效服务 
    * 2017年11月30日 下午2:42:14 
    * @String
     */
    public String createServiceCount(String vipIdAndLibId,String type);
    /**
     * 获取会员对应的服务
    * @param vipIdAndLibId
    * @return
    * 创建人：ZhangCaibao 
    * 2017年11月30日 下午4:23:27 
    * @String
     */
    public String getServiceCount(String vipIdAndLibId);
    
    /**
     * 
     * @Title: getGrWord
     * @Description: 获取某个年级的二会字
     * @param @param wordKey
     * @return String    返回类型
     * @author shenhao
     * @date 2017年12月21日 下午4:48:02
     * @throws
     */
    public String getGrWord(String wordKey,int grade);
    
    public void delToken(String userId);
    
    
    /**
     * reids存放信鸽
    * @param derver
    * @param xinge
    * @return
    * 创建人：ZhangCaibao 
    * 2018年4月25日 上午10:27:48 
    * @String
     */
    public String setXinge(String derver,String xinge);
    
    /**
     * reids存放环信id
    * @param derver
    * @param xinge
    * @return
    * 创建人：ZhangCaibao 
    * 2018年4月25日 上午10:27:48 
    * @String
     */
    public String setEasemob(String derver,String easemobName);
    public String getEasemob(String derver);
    
    public String setXingeAlias(String userId,String alias);
    public String getXingeAlias(String userId);
    
    public String getXinge(String derver);

    /**
     * 同步加锁
     * @param key 锁的key
     * @param requestId 请求标识
     * @param expireSeconds 超时时间（单位：秒）
     * @return 加锁成功返回true，否则false
     */
    boolean addLock(String key, String requestId, int expireSeconds);

    /**
     * 释放同步锁
     * @param key 锁的key
     * @param requestId 请求标识
     * @return 释放锁成功返回true，否则false
     */
    boolean unLock(String key, String requestId);

    /**
     * 记录一次密码错误，超过5次则锁定账号30分钟
     * @param userAccount 用户账号
     * @param clientType 客户端类型
     * @return 当前错误次数
     */
    int recordPasswordWrong(String userAccount, String clientType);

    /**
     * 清空密码错误记录
     * @param userAccount 用户账号
     */
    void clearPasswordWrongRecord(String userAccount);

    /**
     * 自增 如果key值不存在会赋值为0之后再自增1
     * @param key
     * @return
     */
    Long incrKey(String key);

    /**
     * 按照指定的值进行增长
     * @param key keyName
     * @param incrAmout 增长数值
     * @return
     */
    Long incrByLong(String key,Long incrAmout);

    /**
     * 刷新锁的过期时间
     *
     * @param key 缓存的key
     * @param expireSeconds 新过期时间
     */
    void refreshExpireTime(String key, int expireSeconds);
}
