package com.czg.service.account.util;

import cn.hutool.core.util.StrUtil;
import cn.hutool.http.HttpUtil;
import com.alibaba.fastjson.JSONObject;
import com.czg.constants.ParamCodeCst;
import com.czg.system.service.SysParamsService;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.apache.dubbo.config.annotation.DubboReference;
import org.springframework.stereotype.Component;

import java.util.LinkedHashMap;
import java.util.Map;

/**
 * 微信公众号
 *
 * @author ww
 */
@Data
@Slf4j
@Component
public class AcAccountUtil {

    @DubboReference
    private SysParamsService paramsService;

    static LinkedHashMap<String, String> linkedHashMap = new LinkedHashMap<>();

    static {
        linkedHashMap.put("40001", "获取 access_token 时 AppSecret 错误，或者 access_token 无效。请开发者认真比对 AppSecret 的正确性，或查看是否正在为恰当的公众号调用接口");
        linkedHashMap.put("40003", "不合法的 OpenID ，请开发者确认 OpenID （该用户）是否已关注公众号，或是否是其他公众号的 OpenID");
        linkedHashMap.put("40014", "不合法的 access_token ，请开发者认真比对 access_token 的有效性（如是否过期），或查看是否正在为恰当的公众号调用接口");
        linkedHashMap.put("40037", "不合法的 template_id");
        linkedHashMap.put("43101", "用户未订阅消息");
        linkedHashMap.put("43107", "订阅消息能力封禁");
        linkedHashMap.put("43108", "并发下发消息给同一个粉丝");
        linkedHashMap.put("45168", "命中敏感词");
        linkedHashMap.put("47003", "参数错误");
    }


    /**
     * 获取临时二维码用于关注公众号 30天（即2592000秒）后过期
     */
    public String createQrCode(Long userId) {
        String accessToken = getAccessToken();
//        String accessToken = "97_HZVThQrtvOiCZGrr23ZHN0cVpHBJHc18RSFHU6dvkQDMAme4GsG0NU-Dax1HP5Wx-aGa1l35KaqiMVv61TCj0Qk8DK1LC6kQ8uKLDfgRYVJjX3QjcelmIjp4PCkERBeABAUHR";
        if (StrUtil.isBlank(accessToken)) {
            log.error("银收客czg 公众号获取 access_token 失败");
            return "";
        }
        String bodyJson = "{\"action_info\":{\"scene\":{\"scene_str\":\"" + userId + "\"}},\"action_name\":\"QR_STR_SCENE\",\"expire_seconds\":\"2592000\"}";
//        JSONObject bodyJson = new JSONObject();
//        //二维码有效时间（秒），最大2592000，仅临时二维码需要
//        bodyJson.put("expire_seconds", "2592000");
//        //二维码类型：QR_SCENE(临时整型)/QR_STR_SCENE(临时字符串)/QR_LIMIT_SCENE(永久整型)/QR_LIMIT_STR_SCENE(永久字符串)
//        bodyJson.put("action_name", "QR_STR_SCENE");
//        JSONObject actionInfo = new JSONObject();
//        JSONObject scene = new JSONObject();
//        scene.put("scene_str", userId.toString());
//        actionInfo.put("scene", scene);
//        bodyJson.put("action_info", actionInfo);
        String url = StrUtil.format("https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token={}", accessToken);
        String resp = HttpUtil.post(url, bodyJson);
        /**
         * {
         *   "ticket": "gQH47joAAAAAAAAAASxodHRwOi8vd2VpeGlu...",
         *   "expire_seconds": 60,
         *   "url": "http://weixin.qq.com/q/kZgfwMTm72WWPkovabbI"
         * }
         */
        JSONObject respInfo = JSONObject.parseObject(resp);
        if (respInfo.get("url") == null) {
            log.error("创建临时二维码失败,发送参数:url:{}, {}, 响应内容: {}", url, bodyJson, resp);
            return "";
        }
        return respInfo.get("url").toString();
    }


    public String getAccessToken() {
        Map<String, String> userAc = paramsService.getParamsByMap("user_ac_key_set", ParamCodeCst.USER_AC_KEY_SET);
        // 用户小程序参数
        String acAppId = userAc.get(ParamCodeCst.Wechat.Ac.USER_WX_AC_APP_ID);
        String acSecrete = userAc.get(ParamCodeCst.Wechat.Ac.USER_WX_AC_SECRETE);

        String resp = HttpUtil.get(StrUtil.format("https://access-token.sxczgkj.com/accessToken?appId={}&appSecret={}", acAppId, acSecrete));
//       响应 {"accessToken":"100_6C_jltHANT1y2Fot5PXKFDzPXTyWumCsao0oMoNRvJUTuxS0IOVO4nBmjdmx5dZfYItShFVSAKYzNDf7ZGLPlx52ii1Y1qerrbbSmIiLWCrec5qjBY4gV5Tfv8YKKTdABAEEN","appId":"wx212769170d2c6b2a"}
        if (StrUtil.isNotBlank(resp)) {
            JSONObject respInfo = JSONObject.parseObject(resp);
            return respInfo.getString("accessToken");
        } else {
            String resp2 = HttpUtil.get(StrUtil.format("https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={}&secret={}", acAppId, acSecrete));
            JSONObject respInfo = JSONObject.parseObject(resp2);
            if (!respInfo.containsKey("access_token")) {
                log.warn("银收客czg 公众号获取token失败, 响应内容: {}", resp2);
                return "";
            }
            return respInfo.getString("access_token");
        }
    }
}
