package com.yiqi.crm.service.impl;

import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.yiqi.common.config.CompositeWxMaService;
import com.yiqi.common.exception.GlobalException;
import com.yiqi.common.utils.DateUtils;
import com.yiqi.crm.domain.WxMenu;
import com.yiqi.crm.mapper.WxMenuMapper;
import com.yiqi.crm.service.IWxMenuService;
import lombok.extern.java.Log;
import me.chanjar.weixin.common.bean.menu.WxMenuButton;
import me.chanjar.weixin.common.error.WxErrorException;
import me.chanjar.weixin.mp.api.WxMpService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.stream.Collectors;

/**
 * 微信菜单管理Service业务层处理
 *
 * @author ruoyi
 * @date 2023-08-04
 */
@Log
@Service
public class WxMenuServiceImpl extends ServiceImpl<WxMenuMapper, WxMenu> implements IWxMenuService {
    @Autowired
    private WxMenuMapper wxMenuMapper;

    @Autowired
    CompositeWxMaService compositeWxMaService;

    /**
     * 查询微信菜单管理
     *
     * @param wxMenuId 微信菜单管理主键
     * @return 微信菜单管理
     */
    @Override
    public WxMenu selectWxMenuByWxMenuId(Long wxMenuId) {
        return wxMenuMapper.selectWxMenuByWxMenuId(wxMenuId);
    }

    /**
     * 查询微信菜单管理列表
     *
     * @param wxMenu 微信菜单管理
     * @return 微信菜单管理
     */
    @Override
    public List<WxMenu> selectWxMenuList(WxMenu wxMenu) {
        List<WxMenu> wxMenus = wxMenuMapper.selectWxMenuList(wxMenu);
        if (CollUtil.isEmpty(wxMenus)){
            return null;
        }
        return wxMenus.stream().sorted(Comparator.comparing(WxMenu::getSort)).collect(Collectors.toList());
    }

    @Override
    public List<WxMenu> getAllWxMenu() {
        List<WxMenu> wxMenus = this.selectWxMenuList(new WxMenu());
        return wxMenus.stream().filter(wxMenu -> "0".equals(wxMenu.getStatus())).collect(Collectors.toList());
    }

    /**
     * 查询微信菜单类型列表
     * @return 微信菜单管理
     */
    @Override
    public List<WxMenu> getMenuTypeList() {
        List<WxMenu> wxMenus = wxMenuMapper.getMenuTypeList();
        if (CollUtil.isEmpty(wxMenus)){
            return null;
        }
        return wxMenus.stream()
                .filter(wxMenu -> StrUtil.isEmpty(wxMenu.getWxMenuType()))
                .sorted(Comparator.comparing(WxMenu::getSort))
                .collect(Collectors.toList());
    }


    /**
     * 新增微信菜单管理
     *
     * @param wxMenu 微信菜单管理
     * @return 结果
     */
    @Override
    public int insertWxMenu(WxMenu wxMenu) {
        this.checkCondition(wxMenu);
        wxMenu.setCreateTime(DateUtils.getNowDate());
        return wxMenuMapper.insertWxMenu(wxMenu);
    }

    /**
     * 修改微信菜单管理
     *
     * @param wxMenu 微信菜单管理
     * @return 结果
     */
    @Override
    public int updateWxMenu(WxMenu wxMenu) {
//        this.checkCondition(wxMenu);
        return wxMenuMapper.updateWxMenu(wxMenu);
    }

    /**
     * 批量删除微信菜单管理
     *
     * @param wxMenuIds 需要删除的微信菜单管理主键
     * @return 结果
     */
    @Override
    public int deleteWxMenuByWxMenuIds(Long[] wxMenuIds) {
        return wxMenuMapper.deleteWxMenuByWxMenuIds(wxMenuIds);
    }

    /**
     * 删除微信菜单管理信息
     *
     * @param wxMenuId 微信菜单管理主键
     * @return 结果
     */
    @Override
    public int deleteWxMenuByWxMenuId(Long wxMenuId) {
        return wxMenuMapper.deleteWxMenuByWxMenuId(wxMenuId);
    }

    public void checkCondition(WxMenu wxMenu){
        // 如果父级菜单为空
        if ("null".equals(String.valueOf(wxMenu.getParentId()))){
            List<WxMenu> wxMenus = wxMenuMapper.selectWxMenuList(new WxMenu());
            List<WxMenu> menus = wxMenus.stream().filter(vo -> "null".equals(String.valueOf(vo.getParentId()))).collect(Collectors.toList());
            if (menus.size()>2){
                throw new GlobalException("操作失败,微信父级菜单数量最多3个");
            }
        }
        WxMenu menu = new WxMenu();
        menu.setParentId(wxMenu.getParentId());
        List<WxMenu> wxMenus = wxMenuMapper.selectWxMenuList(menu);
        if (wxMenus.size()>4){
            throw new GlobalException("操作失败,微信扩展菜单数量最多5个");
        }
    }
    @Override
    public void createMenu() throws WxErrorException {
        List<WxMenuButton> wxMenuButtons = this.getWxMenu();
        log.info("生成微信菜单参数: "+ wxMenuButtons);
        me.chanjar.weixin.common.bean.menu.WxMenu wxMenu = new me.chanjar.weixin.common.bean.menu.WxMenu();
        wxMenu.setButtons(wxMenuButtons);
        compositeWxMaService.getPublic().getMenuService().menuCreate(wxMenu);
    }

    private List<WxMenuButton> getWxMenu() {
        List<WxMenu> allWxMenu = this.getAllWxMenu();
        if (CollUtil.isEmpty(allWxMenu)){
            throw new GlobalException("菜单配置为空,无法生成菜单");
        }
        List<WxMenuButton> buttons = new ArrayList<>();
        //查询父级菜单
        List<WxMenu> parentMenuList = allWxMenu.stream()
                .filter(menu -> "null".equals(String.valueOf(menu.getParentId())))
                .collect(Collectors.toList());
        // 循环组装父级和父级下面的子集
        parentMenuList.forEach(parent -> {
            if (this.getWxMenuButtonByWxMenu(parent) != null){
                buttons.add(this.getWxMenuButtonByWxMenu(parent));
            }
            // 没有菜单类型，说明本层级是父级，下面可能有子集
            if (StrUtil.isEmpty(parent.getWxMenuType())){
                WxMenuButton btn = new WxMenuButton();
                btn.setName(parent.getWxMenuName());
                //查询子级菜单
                List<WxMenu> ziMenuList = allWxMenu.stream()
                        .filter(ziMenu -> parent.getWxMenuId().equals(ziMenu.getParentId()))
                        .collect(Collectors.toList());
                List<WxMenuButton> ziList = new ArrayList<>();
                if (CollUtil.isNotEmpty(ziMenuList)){
                    ziMenuList.forEach(zi ->{
                        ziList.add(this.getWxMenuButtonByWxMenu(zi));
                    });
                }
                btn.setSubButtons(ziList);
                buttons.add(btn);
            }
        });
        return buttons;
    }

    public WxMenuButton getWxMenuButtonByWxMenu(WxMenu wxMenu){
        WxMenuButton btn = new WxMenuButton();
        // 关键字回复菜单
        if ("1".equals(wxMenu.getWxMenuType())){
            btn.setType("click");
            btn.setName(wxMenu.getWxMenuName());
            btn.setKey(wxMenu.getKeyWords());
            return btn;
        }
        // url链接菜单
        if ("2".equals(wxMenu.getWxMenuType())){
            btn.setType("view");
            btn.setName(wxMenu.getWxMenuName());
            btn.setUrl(wxMenu.getPicTextUrl());
            return btn;
        }
        // 微信扩展菜单
        if ("3".equals(wxMenu.getWxMenuType())){
            btn.setType(wxMenu.getExtendMenu());
            btn.setName(wxMenu.getWxMenuName());
            btn.setKey(wxMenu.getExtendMenu());
            return btn;
        }
        return null;
    }
}
