package com.boco.nbd.wios.wx.call;

import com.boco.nbd.cams.core.constant.CamsConstant;
import com.ihidea.core.util.HttpClientUtils;
import com.ihidea.core.util.JSONUtilsEx;
import com.ihidea.core.util.PropertyUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import java.util.Map;

/**
 * 微信小程序访问类
 *
 * @author Administrator
 */
@Component
public class WeChatApi {

    public static final Logger logger = LoggerFactory.getLogger(WeChatApi.class);
    /**
     * 小程序code换取openid和session_key
     */
    private final static String get_session_key_url = "https://api.weixin.qq.com/sns/jscode2session?appid=APPID&secret=SECRET&js_code=JSCODE&grant_type=authorization_code";

    /**
     * 根据经纬度获取城市信息
     */
    private final static String baidu_map_api = "http://api.map.baidu.com/reverse_geocoding/v3/?ak=c8zGDQn1tajuQwEKHX1BELG2n6zygA8C&output=json&location=LAT,LNG&pois=0";

    /**
     * 获取小程序AccessToken
     */
    private final static String get_xcx_accessToken_url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET";

    private static String minaAppId;

    @Value("${mina.appId}")
    public void setMinaAppId(String appId) {
        WeChatApi.minaAppId = appId;
    }

    private static String minaAppSecret;

    @Value("${mina.appSecret}")
    public void setMinaAppSecret(String appSecret) {
        WeChatApi.minaAppSecret = appSecret;
    }

    /**
     * 根据code获取openId及sessionKey
     *
     * @param code
     * @return
     * @author
     * @date
     */
    @SuppressWarnings("unchecked")
    public static Map<String, String> getXcxOpenIdOrSessionKey(String code) {
        String requestUrl = get_session_key_url.replace("APPID", minaAppId)
                .replace("SECRET", minaAppSecret).replace("JSCODE", code);
        // 调用URL获取相应信息
        return JSONUtilsEx.deserialize(HttpClientUtils.get(requestUrl), Map.class);
    }

    /**
     * 根据经纬度调用百度API获取城市信息
     *
     * @param lat 经度
     * @param lng 纬度
     * @return
     * @author lvpeng
     * @date 2017年11月6日
     */
    public static String getLocationByLatAndLng(String lat, String lng) {
        String requestUrl = baidu_map_api.replace("LAT", lat).replace("LNG", lng);
        return HttpClientUtils.post(requestUrl);
    }

    /**
     * 获取小程序的accessToken
     *
     * @return
     */
    public static Map<String, Object> getXCXAccessToken() {
        // 调用URL获取相应信息
        String requestUrl = get_xcx_accessToken_url.replace("APPID", PropertyUtils.getProperty("mina.appid")).replace("APPSECRET", PropertyUtils.getProperty("mina.appSecret"));
        String jsonStr = HttpClientUtils.get(requestUrl, null, CamsConstant.UTF_8, CamsConstant.UTF_8);
        return JSONUtilsEx.deserialize(jsonStr, Map.class);
    }
}