package com.ruoyi.common.auth.wx;

import java.util.concurrent.TimeUnit;

import com.ruoyi.common.auth.wx.config.WxConfig;
import com.ruoyi.common.constant.CacheConstants;
import com.ruoyi.common.core.redis.RedisCache;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.spring.SpringUtils;

import cn.binarywang.wx.miniapp.api.WxMaService;
import cn.binarywang.wx.miniapp.api.impl.WxMaServiceImpl;
import cn.binarywang.wx.miniapp.config.impl.WxMaDefaultConfigImpl;
import lombok.SneakyThrows;

public class AccessTokenUtil {

    @SneakyThrows
    public static String getToken(WxConfig wxConfig) {
        if (wxConfig == null) {
            return null;
        }

        RedisCache redisCache = SpringUtils.getBean(RedisCache.class);

        String cacheKey = CacheConstants.WX_ACCESS_TOKEN + wxConfig.getAppId();
        String token = redisCache.getCacheObject(cacheKey);

        if (StringUtils.isBlank(token)) {
            WxMaService wxMaService = new WxMaServiceImpl();
            WxMaDefaultConfigImpl config = new WxMaDefaultConfigImpl();
            config.setAppid(wxConfig.getAppId());
            config.setSecret(wxConfig.getAppSecret());
            wxMaService.setWxMaConfig(config);
            token = wxMaService.getAccessToken();

            redisCache.setCacheObject(cacheKey, token, 3600, TimeUnit.SECONDS);
        }
        return token;
    }

    /**
     * 清除token
     * @param appId
     */
    public static void clearToken(String appId) {
        if (StringUtils.isBlank(appId)) {
            return;
        }
        RedisCache redisCache = SpringUtils.getBean(RedisCache.class);
        redisCache.deleteObject(CacheConstants.WX_ACCESS_TOKEN + appId);
    }
}
