
package org.tio.sitexxx.service.cache;

import org.tio.utils.time.Time;

import java.util.Objects;

/**
 * @author tanyaowu
 * 2016年8月16日 上午10:22:25
 */
public enum CacheConfig {
    // [[----------------------  两级缓存 start ----------------------

	/**
	 * key: sessionId
	 * value: 验证码
	 */
	CAPTCHA(CacheType.CAFFEINE_REDIS, Time.MINUTE_1 * 5, null),

	CHAT_ITEM_LIST(CacheType.CAFFEINE, Time.MINUTE_1 * 5, null),
	/**
	 * anji
	 * key: anji_key
	 * value: 验证码
	 */
	ANJI_CAPTCHA(CacheType.CAFFEINE, Time.MINUTE_1 * 5, Time.MINUTE_1 * 5),

	/**
	 * key:   ip
	 * value: ipinfo对象
	 */
	IP_IPINFO(CacheType.CAFFEINE_REDIS, null, Time.HOUR_1 * 6),

	/**
	 * session里的一些属性需要的存活期比较短，就用这个
	 * key: sessionId + key
	 * value: Serializable
	 */
	SESSION_5_MINUTES(CacheType.CAFFEINE_REDIS, Time.MINUTE_1 * 5, null),

	/**
	 * tio临时访问令牌
	 * key: 用户的session cookie值
	 * value: 比较复杂，不在此描述
	 */
	TIO_ACCESS_TOKEN_TEMP(CacheType.CAFFEINE_REDIS, Time.MINUTE_1, null),

	/**
	 * tio访问令牌
	 * key: 用户的session cookie值
	 * value: 比较复杂，不在此描述
	 */
	TIO_ACCESS_TOKEN(CacheType.CAFFEINE_REDIS, Time.MINUTE_1 * 120, null),

	/**
	 * 在给客户端（含浏览器和APP）生成access_token时，对方的useragent信息
	 * key: access_token
	 * value: useragent
	 */
	TIO_ACCESSTOKEN_USERAGENT(CacheType.CAFFEINE_REDIS, Time.MINUTE_1 * 125, null),

	/**
	 * 存活5秒的两级缓存，key值由业务控制
	 */
	TIME_TO_LIVE_SECONDS_5(CacheType.CAFFEINE_REDIS, Time.SECOND_1 * 5, null),

	/**
	 * 存活5分钟的两级缓存，key值由业务控制
	 */
	TIME_TO_LIVE_MINUTE_5(CacheType.CAFFEINE_REDIS, Time.MINUTE_1 * 5, null),

	/**
	 * 闲置5秒的两级缓存，key值由业务控制
	 */
	TIME_TO_IDLE_SECONDS_5(CacheType.CAFFEINE_REDIS, null, Time.SECOND_1 * 5),

	/**
	 * 群用户缓存
	 * key:id
	 * value:WxGroupUser
	 */
	WX_GROUP_USER_2(CacheType.CAFFEINE, Time.HOUR_1, Time.HOUR_1),
	
    /**************************************xufei-add-or-rewrite-begin**********************************************************/

	/**
	 * 聊天会话焦点缓存
	 * key:uid_devicetype
	 * value:FocusVo
	 * 2020-06-23 xufei-update:CAFFEINE_REDIS 改为 CASE_1_12
	 * 
	 */
	CHAT_ON_FOCUS_3(CacheType.CAFFEINE, Time.MINUTE_1 * 3, null),
	
	/**
	 * 焦点刷新时间
	 */
	CHAT_FOCUS_REFRESH_TIME_1(CacheType.CAFFEINE, Time.SECOND_1 * 50, null),
	
	/**
	 * 聊天会话设备记录缓存
	 */
	CHAT_ON_FOCUS_DEVICE_2(CacheType.CAFFEINE, Time.MINUTE_1 * 5, null),

	/**
	 * 用户聊天列表群组索引-单用户会落在一台服务器上
	 * key:groupid_uid
	 * value:WxChatGroupItem
	 */
	CHAT_GROUP_INDEX_4(CacheType.CAFFEINE, Time.HOUR_1, Time.HOUR_1),

	/**
	 * 群用户列表
	 * key:groupid/groupid_limitparams
	 * value:Arraylist<record>
	 * 2020-06-23 xufei-update:CAFFEINE_REDIS 改为 CASE_1_2
	 */
	CHAT_GROUP_USER_LIST_3(CacheType.CAFFEINE, Time.SECOND_1 * 30, Time.SECOND_1 * 30),

	/**
	 * 用户聊天列表用户索引-单用户会落在一台服务器上
	 * key:uid_chatmode_bizid
	 * value:WxChatUserItem
	 */
	CHAT_USER_INDEX_2(CacheType.CAFFEINE, Time.HOUR_1 * 12, Time.HOUR_1 * 12),

	/**
	 * 用户聊天会话-单用户会落在一台服务器上
	 * key:id
	 * value:WxChatItems
	 * 2020-06-23 xufei-update:CAFFEINE_REDIS 改为 CASE_1_2
	 */
	CHAT_ITEMS_6(CacheType.CAFFEINE, Time.MINUTE_1 * 30, Time.MINUTE_1 * 30),

	/**
	 * 用户的被申请记录
	 * key:id
	 * value:Record
	 */
	WX_FRIEND_APPLY_INFO_1(CacheType.CAFFEINE_REDIS, Time.HOUR_1 * 12, Time.DAY_1),

	/**
	 * 拉黑记录
	 * key:uid_touid
	 * value:WxUserBlackItems
	 */
	CHAT_USER_BLOCK_1(CacheType.CAFFEINE, Time.HOUR_1 * 12, Time.DAY_1),
	
	/**
	 * 集群用户会话缓存记录表
	 * key:uid
	 * value:<chatlinkid>
	 */
	WX_USER_CLU_CHATCACHE_1(CacheType.CAFFEINE, null, Time.DAY_1),
	
	
	/**
	 * 登录token记录
	 * key:token
	 * value:1
	 */
	WX_USER_LOGIN_TOKEN_1(CacheType.CAFFEINE, Time.HOUR_1, Time.HOUR_1),
    /**************************************xufei-add-or-rewrite--end-**********************************************************/

    // ----------------------  两级缓存 end ----------------------]]

    // [[----------------------  redis缓存 start ----------------------

	/**
	 *  邮箱注册，邮箱激活码
	 * key: 激活码
	 * value: User
	 */
	EMAIL_AUTHCODE(CacheType.CAFFEINE, Time.MINUTE_1 * 15, Time.MINUTE_1 * 15),

	/**
	 * 每天每个IP邮件发送上限
	 * key：   ip
	 * value:最近24小时发送email的次数
	 */
	EMAIL_SENT_COUNT_PERIP_PERDAY(CacheType.CAFFEINE, Time.HOUR_1 * 24, Time.HOUR_1 * 24),

	/**
	 * 每天邮件发送上限
	 * key：   ip
	 * value:最近24小时发送email的次数
	 */
	EMAIL_SENT_COUNT_PERDAY(CacheType.CAFFEINE, Time.HOUR_1 * 24, Time.HOUR_1 * 24),

	/**
	 * 访问令牌第一步请求的返回值对象
	 * key: 比较复杂，不在此描述
	 * value: AccessTokenResp1
	 * 2020-06-23 xufei-update:CAFFEINE_REDIS 改为 CASE_1_2
	 */
	ACCESS_TOKEN_RESP_1(CacheType.CASE_1_2, Time.SECOND_1 * 5, null),

	/**
	 * 短信ip统计
	 */
	SMS_IP_COUNT(CacheType.CAFFEINE, Time.HOUR_1 * 24, Time.HOUR_1 * 24),

	/**
	 * 短信次数统计
	 */
	SMS_MOBILE_COUNT(CacheType.CAFFEINE, Time.HOUR_1 * 24, Time.HOUR_1 * 24),

	/**
	 * 设备短信次数
	 */
	SMS_DEVICE_COUNT(CacheType.CAFFEINE, Time.HOUR_1 * 2, Time.HOUR_1 * 2),

	/**
	 * 短信验证码缓存
	 */
	SMS_MOBILE_CODE(CacheType.CAFFEINE, Time.MINUTE_1 * 10, Time.MINUTE_1 * 10),

	/**
	 * 用户是否正在通话
	 * key: uid
	 * value: 对方的uid
	 */
	WX_IS_CALLING(CacheType.CAFFEINE, null, Time.HOUR_1 * 12),

	/**
	 * 
	 */
	WX_IS_CALLING_TIME(CacheType.CAFFEINE, null, Time.SECOND_1 * 15),
	/**
	 * 用户通话状态
	 */
	WX_CALL_STATUS(CacheType.CAFFEINE, null, Time.HOUR_1 * 12),

	/**
	 * 用户通话状态
	 */
	WX_CALL_ROOM(CacheType.CAFFEINE, null, Time.HOUR_1 * 12),

	/**
	 * 
	 */
	WX_IS_CALLING_EXP(CacheType.CAFFEINE, null, Time.DAY_1 * 30),

    // ----------------------  redis缓存 end ----------------------]]

    // ----------------------  caffeine 缓存 start ----------------------]]

	/**
	 * 搜索用户
	 * key: 可能是nick，也可能是其它
	 * value: Page<Record>
	 */
	SEARCH_USER(CacheType.CAFFEINE, Time.MINUTE_1, Time.MINUTE_1),

	/**
	 * 搜索用户
	 * key: 可能是uid
	 * value: Page<Record>
	 * 一小时过期
	 */
	USER_INFO_3(CacheType.CAFFEINE, null, Time.HOUR_1),

	/**
	 * key: userid + ""
	 * value: user
	 */
	USERID_USER_7(CacheType.CAFFEINE, null, Time.HOUR_1),

	/**
	 * 用户基础信息缓存信息
	 * key: userid + ""
	 * value: <userBase>
	 */
	USERID_BASE(CacheType.CAFFEINE, null, Time.HOUR_1),

	/**
	 * key: loginname
	 * value: user
	 */
	LOGINNAME_USER_1(CacheType.CAFFEINE, null, Time.HOUR_1),

	/**
	 * 存活5分钟的本地缓存，key值由业务控制
	 */
	TIME_TO_LIVE_MINUTE_5_LOCAL(CacheType.CAFFEINE, null, Time.MINUTE_1 * 5),

	/**
	 * key:   user_agent串
	 * value: UserAgent对象
	 * 2020-06-23 xufei-update:CAFFEINE 改为 CASE_1_12
	 */
	USER_AGENT(CacheType.CASE_1_12, null, Time.HOUR_1),

	/**
	 * 基础配置缓存
	 */
	CONFIG_BASE(CacheType.CASE_1_2, null, Time.MINUTE_1 * 12),

	/**
	 * view工程，html的缓存
	 * key: path
	 * value: HttpResponse
	 */
	VIEW_HTML(CacheType.CAFFEINE, null, Time.HOUR_1 * 19),

	/**
	 * 群基础信息
	 * key: groupid
	 * value: wxGroup 
	 * 2020-06-24 xufei-update:CAFFEINE 改为 CASE_1_2
	 */
	WX_GROUP_4(CacheType.CAFFEINE, Time.MINUTE_1 * 5, Time.MINUTE_1 * 5),

	/**
	 * 通讯录列表
	 * key:用户id
	 * value:HashMap<string,object>
	 * 2020-06-24 xufei-update:CAFFEINE 改为 CASE_1_2
	 */
	WX_MAILLIST_2(CacheType.CAFFEINE, Time.MINUTE_1 * 30, Time.MINUTE_1 * 30),

	/**
	 *	新版本私聊记录
	 * key: chatlinkid
	 * value: ListWithLock<WxFriendMsg>
	 * 2020-06-24 xufei-update:CAFFEINE 改为 CASE_1_2
	 */
	WX_FRIEND_MSG_CHAT_6(CacheType.CAFFEINE, Time.MINUTE_1 * 30, Time.MINUTE_1 * 30),

	/**
	 *	新版本群聊记录
	 * key: groupid
	 * value: ListWithLock<WxGroupMsg>
	 * 2020-06-24 xufei-update:CAFFEINE 改为 CASE_1_2
	 */
	WX_GROUP_CHAT_6(CacheType.CAFFEINE, Time.MINUTE_1 * 10, Time.MINUTE_1 * 10),

	/**
	 * 我的好友，主要是有一个备注名是因人而异的，所以要特别处理一下
	 * key: uid + "_" + frienduid
	 * value: WxFriend对象
	 * 2020-06-24 xufei-update:CAFFEINE 改为 CASE_1_2
	 */
	WX_MY_FRIEND(CacheType.CAFFEINE, null, Time.HOUR_1),

	/**
	 * 当前用户数
	 * 单值
	 */
	USER_COUNT(CacheType.CAFFEINE, null, Time.HOUR_1),

	/**
	 * 群推送
	 */
	WX_GROUP_PUSH(CacheType.CAFFEINE, null, Time.HOUR_1),
	/**
	 * WxCallItem对象
	 * key: id
	 * value: WxCallItem
	 * 2020-06-24 xufei-update:CAFFEINE 改为 CASE_1_2
	 */
	WXCALLITEM_1(CacheType.CASE_1_2, null, Time.MINUTE_1 * 30),

	///占用的
	XXXXXXXXXX(CacheType.CAFFEINE, Time.HOUR_1, null);

	// ----------------------  caffeine 缓存 end ----------------------]]


    CacheType	cacheType;
	String		cacheName;
	Long		timeToLiveSeconds;	//单位：秒

	Long timeToIdleSeconds; //单位：秒

	CacheConfig(CacheType cacheType, Long timeToLiveSeconds, Long timeToIdleSeconds) {
		this.cacheType = cacheType;
		this.timeToLiveSeconds = timeToLiveSeconds;
		this.timeToIdleSeconds = timeToIdleSeconds;
		this.cacheName = this.name();
	}

	public static CacheConfig from(String cacheName) {
		CacheConfig[] values = CacheConfig.values();
		for (CacheConfig v : values) {
			if (Objects.equals(v.cacheName, cacheName)) {
				return v;
			}
		}
		return null;
	}

	public String getCacheName() {
		return cacheName;
	}

	public CacheType getCacheType() {
		return cacheType;
	}

	public Long getTimeToIdleSeconds() {
		return timeToIdleSeconds;
	}

	public Long getTimeToLiveSeconds() {
		return timeToLiveSeconds;
	}
}
