package com.yonge.cooleshow.auth.middleware.wechat.impl;

import com.alibaba.fastjson.JSON;
import com.yonge.cooleshow.auth.api.entity.WxConfigInfo;
import com.yonge.cooleshow.auth.api.entity.WxTemplateConfig;
import com.yonge.cooleshow.auth.api.entity.WxTemplateMessage;
import com.yonge.cooleshow.auth.middleware.wechat.WxCacheService;
import com.yonge.cooleshow.auth.service.WxConfigInfoService;
import lombok.extern.slf4j.Slf4j;
import org.redisson.api.RBucket;
import org.redisson.api.RedissonClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.text.MessageFormat;
import java.util.concurrent.TimeUnit;

/**
 * 微信配置信息
 * Created by Eric.Shang on 4/1/18.
 */
@Slf4j
@Service
public class WxCacheServiceImpl implements WxCacheService {

    @Autowired
    private RedissonClient redissonClient;
    @Autowired
    private WxConfigInfoService wxConfigInfoService;

    // 微信相关缓存信息
    private static final String WX_CONFIG_KEY = "wxcfg:{0}"; // wxcfg:[#appid#]

    /**
     * 模板消息内容
     *
     * @param appId 公众号标识
     * @param cmd 消息类型
     * @return WxTemplateMessage
     */
    @Override
    public WxTemplateMessage findWxTemplateMessageBaseInfo(String appId, String cmd) {

        // 公众号模板信息内容
        return wxConfigInfoService.findWxTemplateMessageByCommand(appId, cmd);
    }

    /**
     * 模板消息配置
     *
     * @param appId 公众号标识
     * @param cmd   消息类型
     * @return WxTemplateConfig
     */
    @Override
    public WxTemplateConfig findWxTemplateConfigBaseInfo(String appId, String cmd) {

        return wxConfigInfoService.findWxTemplateConfigWhen(appId, cmd);
    }

    /**
     * 查询公众号配置信息
     *
     * @param appId 公众号ID
     * @return String
     */
    @Override
    public String findWxConfigBaseInfo(String appId) {

        // 缓存微信配置信息
        String hash = MessageFormat.format(WX_CONFIG_KEY, appId);
        RBucket<Object> bucket = redissonClient.getBucket(hash);
        // 缓存数据已失效，重新生成缓存数据
        if (!bucket.isExists()) {
            WxConfigInfo config = wxConfigInfoService.findWxConfigInfoByAppId(appId);
            if (config == null) {
                log.warn("findWxConfigBaseInfo 公众号配置不存在, appId={}", appId);
                return "";
            }

            // 缓存数据, 默认缓存7天
            bucket.set(JSON.toJSONString(config), 7, TimeUnit.DAYS);

            // 直接返回
            return JSON.toJSONString(config);
        }

        return (String) bucket.get();
    }

    /**
     * 查询公众号通知消息内容
     *
     * @param appId 公众号Id
     * @return WxConfigInfo
     */
    @Override
    public WxConfigInfo findMPSubscribeNotifyMessageBaseInfo(String appId) {

        // 查询微信公众号配置信息
        return wxConfigInfoService.findWxConfigInfoByAppId(appId);
    }

    /**
     * 更新公众号关注状态
     *
     * @param appId     应用ID
     * @param openId  来源用户
     * @param subscribe 订阅状态
     */
    @Override
    public void updateMpSubscribeStatusInfo(String appId, String openId, Boolean subscribe) {

    }
}
