package com.house365.wechat.rest;

import com.house365.common.util.RestTemplateBean;
import com.house365.wechat.WeChatConstant;
import com.house365.wechat.WeChatProperties;
import com.house365.wechat.aes.WXBizMsgCrypt;
import net.sf.json.JSONObject;
import org.apache.http.NameValuePair;
import org.apache.http.message.BasicNameValuePair;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletRequest;
import java.util.ArrayList;
import java.util.List;

/**
 * Description
 * <p>
 * Created by 365 on 2016/12/30 0030.
 */
@RestController
@RequestMapping("ability")
public class AbilityController {
    private Logger logger = LoggerFactory.getLogger(AbilityController.class);

    @Autowired
    private WeChatProperties weChatProperties;

    /**
     * 发消息
     * 公共参数：
     * <p>  touser 成员ID列表（消息接收者，多个接收者用‘|’分隔，最多支持1000个）。特殊情况：指定为@all，则向关注该企业应用的全部成员发送</p>
     * <p>  toparty 部门ID列表，多个接收者用‘|’分隔，最多支持100个。当touser为@all时忽略本参数</p>
     * <p>  totag 标签ID列表，多个接收者用‘|’分隔，最多支持100个。当touser为@all时忽略本参数</p>
     * <p>  msgtype 消息类型，此时固定为：text （支持消息型应用跟主页型应用）</p>
     * <p>  agentid 企业应用的id，整型。可在应用的设置页面查看</p>
     * <p>  safe 表示是否是保密消息，0表示否，1表示是，默认0</p>
     * <p>
     * text:    text消息
     * <p>  content 消息内容，最长不超过2048个字节，注意：主页型应用推送的文本消息在微信端最多只显示20个字（包含中英文）</p>
     * <p>
     * image:   image消息
     * <p>  media_id 图片媒体文件id，可以调用上传临时素材或者永久素材接口获取,永久素材media_id必须由发消息的应用创建</p>
     * <p>
     * voice:   voice消息
     * <p>  media_id 语音文件id，可以调用上传临时素材或者永久素材接口获取</p>
     * <p>
     * video:   video消息
     * <p>  media_id 视频媒体文件id，可以调用上传临时素材或者永久素材接口获取</p>
     * <p>  title    视频消息的标题，不超过128个字节，超过会自动截断</p>
     * <p>  description 视频消息的描述，不超过512个字节，超过会自动截断</p>
     * <p>
     * file:    file消息
     * <p>  media_id 媒体文件id，可以调用上传临时素材或者永久素材接口获取</p>
     * <p>
     * news:    news消息
     * <p>  articles 图文消息，一个图文消息支持1到8条图文</p>
     * <p>  {   </p>
     * <p>  title 标题，不超过128个字节，超过会自动截断</p>
     * <p>  description 描述，不超过512个字节，超过会自动截断</p>
     * <p>  url 点击后跳转的链接。</p>
     * <p>  picurl 图文消息的图片链接，支持JPG、PNG格式，较好的效果为大图640*320，小图80*80。如不填，在客户端不显示图片</p>
     * <p>  }   </p>
     * <p>
     * mpnews:    mpnews消息
     * <p>  articles 图文消息，一个图文消息支持1到8条图文</p>
     * <p>  {   </p>
     * <p>  title 标题，不超过128个字节，超过会自动截断</p>
     * <p>  thumb_media_id 图文消息缩略图的media_id, 可以在上传多媒体文件接口中获得。此处thumb_media_id即上传接口返回的media_id</p>
     * <p>  author 图文消息的作者，不超过64个字节</p>
     * <p>  content_source_url 图文消息点击“阅读原文”之后的页面链接</p>
     * <p>  content 图文消息的内容，支持html标签，不超过666 K个字节</p>
     * <p>  digest 图文消息的描述，不超过512个字节，超过会自动截断</p>
     * <p>  show_cover_pic 是否显示封面，1为显示，0为不显示</p>
     * <p>  }   </p>
     * mpnews:    mpnews消息（使用永久图文素材id）
     * <p>  media_id 素材资源标识ID，通过上传永久图文素材接口获得。注：必须是在该agent下创建的。</p>
     */
    @RequestMapping(value = "message/send/{method}", method = RequestMethod.POST)
    public String messageSend(HttpServletRequest request, @PathVariable("method") String method) {
        List<NameValuePair> params = new ArrayList<>();
        String accessToken = (String) request.getSession().getAttribute(WeChatConstant.WE_CHAT_ACCESS_TOKEN);
        params.add(new BasicNameValuePair(WeChatConstant.WE_CHAT_ACCESS_TOKEN, accessToken));

        JSONObject message = new JSONObject();
        message.put(WeChatConstant.AGENT_ID, request.getParameter(WeChatConstant.AGENT_ID));
        message.put("touser", request.getParameter("touser"));
        message.put("toparty", request.getParameter("toparty"));
        message.put("totag", request.getParameter("totag"));
        message.put("msgtype", request.getParameter("msgtype"));
        message.put("safe", request.getParameter("safe"));
        message.put(method, request.getParameter("content"));
        String result = "";
        try {
            result = RestTemplateBean.doPost(WeChatConstant.getWeChatPostUrl(WeChatConstant.AGENT_SET, params), message);
        } catch (Exception e) {
            logger.error(e.getMessage(), e);
        }
        return result;
    }

    /**
     * 接收消息
     */
    @RequestMapping(value = "message/receive/{method}", method = RequestMethod.POST)
    public String messageReceive(@PathVariable("method") String method,
                                 @RequestParam(value = "msg_signature") String sVerifyMsgSig,
                                 @RequestParam(value = "timestamp") String sVerifyTimeStamp,
                                 @RequestParam(value = "nonce") String sVerifyNonce,
                                 @RequestParam(value = "echostr") String sVerifyEchoStr) {

        try {
            WXBizMsgCrypt wxBizMsgCrypt = new WXBizMsgCrypt(weChatProperties.getToken(),
                    weChatProperties.getEncodingAESKey(),
                    weChatProperties.getCorpId());
            String sEchoStr = wxBizMsgCrypt.VerifyURL(sVerifyMsgSig, sVerifyTimeStamp, sVerifyNonce, sVerifyEchoStr);
        } catch (Exception e) {
            logger.error(e.getMessage(), e);
        }
        return "";
    }
}
