package com.java110.api.listener.smallWeChat;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.java110.api.bmo.smallWeChat.IWechatMenuBMO;
import com.java110.api.listener.AbstractServiceApiPlusListener;
import com.java110.core.annotation.Java110Listener;
import com.java110.core.context.DataFlowContext;
import com.java110.core.event.service.api.ServiceDataFlowEvent;
import com.java110.core.factory.WechatFactory;
import com.java110.intf.store.ISmallWeChatInnerServiceSMO;
import com.java110.intf.store.IWechatMenuInnerServiceSMO;
import com.java110.dto.smallWeChat.SmallWeChatDto;
import com.java110.dto.wechatMenu.WechatMenuDto;
import com.java110.utils.constant.ServiceCodeWechatMenuConstant;
import com.java110.utils.constant.WechatConstant;
import com.java110.utils.util.Assert;
import com.java110.utils.util.BeanConvertUtil;
import com.java110.vo.ResultVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpMethod;
import org.springframework.http.ResponseEntity;
import org.springframework.web.client.RestTemplate;

import java.util.List;

/**
 * 保存商户侦听
 * add by wuxw 2019-06-30
 */
@Java110Listener("publishWechatMenuListener")
public class PublishWechatMenuListener extends AbstractServiceApiPlusListener {

    @Autowired
    private IWechatMenuBMO wechatMenuBMOImpl;

    @Autowired
    private RestTemplate outRestTemplate;

    @Autowired
    private IWechatMenuInnerServiceSMO wechatMenuInnerServiceSMOImpl;

    @Autowired
    private ISmallWeChatInnerServiceSMO smallWeChatInnerServiceSMOImpl;


    @Override
    protected void validate(ServiceDataFlowEvent event, JSONObject reqJson) {
        //Assert.hasKeyAndValue(reqJson, "xxx", "xxx");
        Assert.hasKeyAndValue(reqJson, "communityId", "请求报文中未包含communityId");
    }

    /**
     * {
     * "button":[
     * {
     * "type":"click",
     * "name":"今日歌曲",
     * "key":"V1001_TODAY_MUSIC"
     * },
     * {
     * "name":"菜单",
     * "sub_button":[
     * {
     * "type":"view",
     * "name":"搜索",
     * "url":"http://www.soso.com/"
     * },
     * {
     * "type":"miniprogram",
     * "name":"wxa",
     * "url":"http://mp.weixin.qq.com",
     * "appid":"wx286b93c14bbf93aa",
     * "pagepath":"pages/lunar/index"
     * },
     * {
     * "type":"click",
     * "name":"赞一下我们",
     * "key":"V1001_GOOD"
     * }]
     * }]
     * }
     *
     * @param event   事件对象
     * @param context 数据上文对象
     * @param reqJson 请求报文
     */
    @Override
    protected void doSoService(ServiceDataFlowEvent event, DataFlowContext context, JSONObject reqJson) {
        //查询一级菜单
        WechatMenuDto wechatMenuDto = BeanConvertUtil.covertBean(reqJson, WechatMenuDto.class);
        wechatMenuDto.setMenuLevel(WechatMenuDto.MENU_LEVEL_ONE);
        List<WechatMenuDto> wechatMenuDtos = wechatMenuInnerServiceSMOImpl.queryWechatMenus(wechatMenuDto);

        if (wechatMenuDtos == null || wechatMenuDtos.size() < 1 || wechatMenuDtos.size() > 3) {
            throw new IllegalArgumentException("一级菜单数量为" + wechatMenuDtos.size() + "不符合公众号菜单数量要求");
        }
        JSONObject wechatMenuObj = new JSONObject();
        JSONArray button = new JSONArray();
        for (WechatMenuDto tmpWechatMenuDto : wechatMenuDtos) {
            wechatMenuDto = new WechatMenuDto();
            wechatMenuDto.setMenuLevel(WechatMenuDto.MENU_LEVEL_TWO);
            wechatMenuDto.setCommunityId(tmpWechatMenuDto.getCommunityId());
            wechatMenuDto.setParentMenuId(tmpWechatMenuDto.getWechatMenuId());
            List<WechatMenuDto> tmpWechatMenuDtos = wechatMenuInnerServiceSMOImpl.queryWechatMenus(wechatMenuDto);
            JSONObject menuButton = new JSONObject();
            menuButton.put("name", tmpWechatMenuDto.getMenuName());
            if (tmpWechatMenuDtos != null && tmpWechatMenuDtos.size() > 0) {
                addSubMenu(menuButton, tmpWechatMenuDtos);
                button.add(menuButton);
                continue;
            }

            menuButton.put("type", tmpWechatMenuDto.getMenuType());
            if (WechatMenuDto.MENU_TYPE_VIEW.equals(tmpWechatMenuDto.getMenuType())) {
                menuButton.put("url", tmpWechatMenuDto.getMenuValue());
            } else if (WechatMenuDto.MENU_TYPE_MINIPROGRAM.equals(tmpWechatMenuDto.getMenuType())) {
                menuButton.put("url", tmpWechatMenuDto.getMenuValue());
                menuButton.put("appid", tmpWechatMenuDto.getAppId());
                menuButton.put("pagepath", tmpWechatMenuDto.getPagepath());
            }
            button.add(menuButton);
        }
        wechatMenuObj.put("button", button);
        SmallWeChatDto smallWeChatDto = new SmallWeChatDto();
        smallWeChatDto.setObjType(SmallWeChatDto.OBJ_TYPE_COMMUNITY);
        smallWeChatDto.setObjId(reqJson.getString("communityId"));
        List<SmallWeChatDto> smallWeChatDtos = smallWeChatInnerServiceSMOImpl.querySmallWeChats(smallWeChatDto);

        if (smallWeChatDtos == null || smallWeChatDtos.size() < 1) {
            throw new IllegalArgumentException("当前小区未配置公众号 请先配置");
        }
        String token = WechatFactory.getAccessToken(smallWeChatDtos.get(0).getAppId(), smallWeChatDtos.get(0).getAppSecret());
        String url = WechatConstant.CREATE_MENU.replace("ACCESS_TOKEN", token);
        ResponseEntity<String> responseEntity = outRestTemplate.postForEntity(url, wechatMenuObj.toJSONString(), String.class);

        JSONObject wechatOutObj = JSONObject.parseObject(responseEntity.getBody());
        context.setResponseEntity(ResultVo.createResponseEntity(wechatOutObj.getInteger("errcode"), wechatOutObj.getString("errmsg")));
    }

    private void addSubMenu(JSONObject wechatMenuObj, List<WechatMenuDto> wechatMenuDtos) {
        JSONArray subButtons = new JSONArray();
        JSONObject subButton = null;
        for (WechatMenuDto wechatMenuDto : wechatMenuDtos) {
            subButton = new JSONObject();
            subButton.put("name", wechatMenuDto.getMenuName());
            subButton.put("type", wechatMenuDto.getMenuType());
            if (WechatMenuDto.MENU_TYPE_VIEW.equals(wechatMenuDto.getMenuType())) {
                subButton.put("url", wechatMenuDto.getMenuValue());
            } else if (WechatMenuDto.MENU_TYPE_MINIPROGRAM.equals(wechatMenuDto.getMenuType())) {
                subButton.put("url", wechatMenuDto.getMenuValue());
                subButton.put("appid", wechatMenuDto.getAppId());
                subButton.put("pagepath", wechatMenuDto.getPagepath());
            }
            subButtons.add(subButton);
        }
        wechatMenuObj.put("sub_button", subButtons);
    }

    @Override
    public String getServiceCode() {
        return ServiceCodeWechatMenuConstant.PUBLIC_WECHATMENU;
    }

    @Override
    public HttpMethod getHttpMethod() {
        return HttpMethod.POST;
    }

}
