/**
 * Copyright (c) 2016-2020, Michael Yang 杨福海 ([email protected]).
 * <p>
 * Licensed under the GNU Lesser General Public License (LGPL) ,Version 3.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * <p>
 * http://www.gnu.org/licenses/lgpl-3.0.txt
 * <p>
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package io.jpress.web.wechat;

import com.jfinal.log.Log;
import com.jfinal.weixin.sdk.api.AccessTokenApi;
import com.jfinal.weixin.sdk.api.ApiResult;
import com.jfinal.weixin.sdk.api.CustomServiceApi;
import com.jfinal.weixin.sdk.api.MediaApi;
import com.jfinal.weixin.sdk.utils.HttpUtils;
import com.jfinal.weixin.sdk.utils.JsonUtils;
import io.jboot.utils.NamedThreadPools;
import io.jpress.commons.utils.AttachmentUtils;

import java.io.File;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ExecutorService;


public class WechatMsgUtil {

    private static final Log LOG = Log.getLog(WechatMsgUtil.class);
    private static ExecutorService pool = NamedThreadPools.newFixedThreadPool(5,"wechat-msg");

    public static void sendImageAsync(String openId, String imageFilePath) {
        pool.submit(() -> {
            sendImage(openId, imageFilePath);
        });
    }

    public static void sendImageAsync(String openId, File imageFile) {
        pool.submit(() -> {
            sendImage(openId, imageFile);
        });
    }

    public static void sendTextAsync(String openId, String text) {
        pool.submit(() -> {
            sendText(openId, text);
        });
    }


    public static boolean sendText(String openId, String text) {
        ApiResult result = CustomServiceApi.sendText(openId, text);
        return result.isSucceed();
    }


    public static boolean sendImage(String openId, String imageFilePath) {
        return sendImage(openId, AttachmentUtils.file(imageFilePath));
    }

    public static boolean sendImage(String openId, File imageFile) {

        if (!imageFile.exists() || !imageFile.isFile() || !imageFile.canRead()) {
            return false;
        }

        /**
         * 上传临时素材
         * {"type":"TYPE","media_id":"MEDIA_ID","created_at":123456789}
         */
        ApiResult apiResult = MediaApi.uploadMedia(MediaApi.MediaType.IMAGE, imageFile);
        if (!apiResult.isSucceed()) {
            LOG.error("MediaApi.uploadMedia..." + imageFile + " \n" + apiResult.toString());
            return false;
        }

        String mediaId = apiResult.get("media_id");
        /**
         * 发送海报
         */
        ApiResult sendImageApiResult = CustomServiceApi.sendImage(openId, mediaId);
        if (!sendImageApiResult.isSucceed()) {
            LOG.error("CustomServiceApi.sendImage() is error : " + imageFile + " \n" + sendImageApiResult.getErrorMsg() + sendImageApiResult.toString());
            return false;
        }

        return true;
    }


    private static String customMessageUrl = "https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token=";

    public static ApiResult sendMiniprogram(String openId,
                                            String title,
                                            String appid,
                                            String pagepath,
                                            File imageCover) {

        if (!imageCover.exists() || !imageCover.isFile() || !imageCover.canRead()) {
            return null;
        }

        /**
         * 上传临时素材
         * {"type":"TYPE","media_id":"MEDIA_ID","created_at":123456789}
         */
        ApiResult apiResult = MediaApi.uploadMedia(MediaApi.MediaType.IMAGE, imageCover);
        if (!apiResult.isSucceed()) {
            LOG.error("MediaApi.uploadMedia..." + imageCover + " \n" + apiResult.toString());
            return apiResult;
        }

        String mediaId = apiResult.get("media_id");


        Map<String, Object> jsonMap = new HashMap<String, Object>();
        jsonMap.put("touser", openId);
        jsonMap.put("msgtype", "miniprogrampage");


        Map<String, Object> miniprogrampageMap = new HashMap<String, Object>();
        miniprogrampageMap.put("title", title);
        miniprogrampageMap.put("appid", appid);
        miniprogrampageMap.put("pagepath", pagepath);
        miniprogrampageMap.put("thumb_media_id", mediaId);

        jsonMap.put("miniprogrampage", miniprogrampageMap);

        String accessToken = AccessTokenApi.getAccessTokenStr();
        String jsonResult = HttpUtils.post(customMessageUrl + accessToken, JsonUtils.toJson(jsonMap));

        return new ApiResult(jsonResult);
    }
}