package com.hzya.frame.plugin.cinvoice.util;

import cn.hutool.core.lang.Assert;
import cn.hutool.core.util.StrUtil;
import cn.hutool.http.HttpRequest;
import com.alibaba.fastjson.JSONObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;

import java.time.Instant;

/**
 * @Description 云帐房accessToken  没用了
 * @Author xiangerlin
 * @Date 2025/4/24 10:03
 **/
public class YzfUtils {
    static Logger logger = LoggerFactory.getLogger(YzfUtils.class);
    //token
    private static String accessToken;
    //过期时间
    private static Instant expireTime;
    private static final Long CACHE_EXPIRY_TIME = 7000L; // 缓存有效时间（秒）
    //应用key
    private static String accessKey;
    //应用密钥
    private static String accessSecret;
    //接口地址
    private static String baseUrl;
    //@Value("${yzf.accessKey:}")
    public static void setaccessKey(String accessKey) {
        YzfUtils.accessKey = accessKey;
    }
    //@Value("${yzf.accessSecret:}")
    public static void setaccessSecret(String accessSecret) {
        YzfUtils.accessSecret = accessSecret;
    }
    //@Value("${yzf.baseUrl:}")
    public static void setBaseUrl(String baseUrl){
        YzfUtils.baseUrl = baseUrl;
    }
    /**
     * 获取token
     * @return
     */
    public static String getAccessToken(){
        return getAccessToken(accessKey,accessSecret);
    }

    /**
     * 获取accessToken
     *
     * @param accessKey
     * @param accessSecret
     * @return
     */
    public static String getAccessToken(String accessKey,String accessSecret) {
        //判断是否过期 如果没过期直接返回
        if (null != accessToken && expireTime != null && Instant.now().isBefore(expireTime)) {
            return accessToken;
        }
        //获取新的accessToken
        accessToken = fetchNewAccessToken(accessKey,accessSecret);
        //过期时间设置成当前事件+7000s，预留200s的时间
        expireTime = Instant.now().plusSeconds(CACHE_EXPIRY_TIME);
        return accessToken;
    }
    /**
     * 获取新的accessToken
     *
     * @return
     */
    private static String fetchNewAccessToken(String accessKey,String accessSecret) {
        try {
            
            if (StrUtil.isNotEmpty(accessKey) && StrUtil.isNotEmpty(accessSecret)) {
                JSONObject param  = new JSONObject();
                param.put("accessKey", YzfUtils.accessKey);
                param.put("accessSecret", YzfUtils.accessSecret);
                String res = HttpRequest.post(YzfUtils.baseUrl+"/api/getToken").body(param.toString()).execute().body();
                logger.info("调用云帐房token返回参数:{}",res);
                if (StrUtil.isNotEmpty(res)){
                    JSONObject tokenObj = JSONObject.parseObject(res);
                    String code = tokenObj.getString("code");
                    if ("0".equals(code)){
                        JSONObject resultObj = tokenObj.getJSONObject("result");
                        if (null != resultObj){
                            return resultObj.getString("accessToken");
                        }
                    }
                }
            }
        } catch (Exception _err) {
            logger.error("获取oken出错:{}", _err);
        }
        return null;
    }
}
