package cn.van.business.util;

import cn.hutool.core.util.ObjectUtil;
import cn.hutool.http.HttpRequest;
import cn.van.business.enums.WXReqType;
import cn.van.business.mq.MessageProducerService;
import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONObject;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Lazy;
import org.springframework.core.env.Environment;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.*;

/**
 * @author Leo
 * @version 1.0
 * @create 2023/12/22 0022 上午 09:59
 * @description：
 */
@Component
public class WXUtil {

    public static final String default_super_admin_wxid = "wxid_ytpc72mdoskt22";
    private static final Logger logger = LoggerFactory.getLogger(WXUtil.class);
    public static String default_bot_wxid = "wxid_kr145nk7l0an31";

    public static Map<String, SuperAdmin> super_admins = new HashMap<>();
    public static Map<String, String> jdidToWxidMap = new HashMap<>();
    public static Map<String, String> jdidToRemarkMap = new HashMap<>();

    // 群聊管理白名单
    public static List<String> chatRoom_admin = new ArrayList<>();
    // 线报来源群
    public static Map<String, String> chatRoom_xb = new HashMap<>();

    // 搬运群，对外带佣金，不带方案
    public static String chatRoom_BY = "50400969285@chatroom";
    /**
     * url http://127.0.0.1:7777/DaenWxHook/httpapi/
     * 获取微信列表 (X0000)
     * 微信状态检测(Q0000)
     * 发送文本消息(Q0001)
     * 修改下载图片 (Q0002)
     * 获取个人信息 (Q0003)
     * 查询对象信(Q0004)
     * 获取好友列表(Q0005)
     * 获取群聊列表(Q0006)
     * 获取公众号列表(Q0007)
     * 获取群成员列表(Q0008)
     * 发送聊天记录(Q0009)
     * 发送图片 (Q0010)
     * 发送本地文件(Q0011)
     * 发送分享链接(Q0012)
     * 发送小程序(Q0013)
     * 发送音乐分享(Q0014)
     * 发送XML (Q0015)
     * 确认收款 (Q0016)
     * 同意好友请求(Q0017)
     * 添加好友通过v3(Q0018)
     * 添加好友_通过wxid (Q0019)
     * 查询陌生人信息(Q0020)
     * 邀请进群(Q0021)
     * 删除好友(Q0022)
     * 修改对象备注(Q0023)
     * 修改群聊名称(Q0024)
     * 发送名片(Q0025)
     */
    public static String WX_BASE_URL;
    private final WxtsUtil wxTsUtil;
    private final MessageProducerService messageProducerService;
    public int sendTimes = 0;
    private Environment env;

    @Autowired
    public WXUtil(Environment env, WxtsUtil wxTsUtil, @Lazy MessageProducerService messageProducerService) {
        this.messageProducerService = messageProducerService;
        this.wxTsUtil = wxTsUtil;
        this.env = env;
        WX_BASE_URL = env.getProperty("config.WX_BASE_URL");
        System.out.println("WX_BASE_URL:" + WX_BASE_URL);
        initSuperAdmins();
    }

    public static String getWxidFromJdid(String jdid) {
        return jdidToWxidMap.get(jdid);
    }

    public static String getRemarkFromJdid(String jdid) {
        return jdidToRemarkMap.get(jdid);
    }

    public static List<SuperAdmin> getSuperAdmins(String wxid) {
        List<SuperAdmin> result = new ArrayList<>();
        for (SuperAdmin admin : super_admins.values()) {
            if (admin.getWxid().equals(wxid)) {
                result.add(admin);
            }
        }
        return result;
    }


    public static List<String> splitStringByLength(String input, int length) {
        List<String> result = new ArrayList<>();
        // 循环增加长度直到超过字符串长度
        for (int start = 0; start < input.length(); start += length) {
            // 截取字符串，但需要检查边界
            int end = Math.min(start + length, input.length());
            result.add(input.substring(start, end));
        }
        return result;
    }

    // 初始化超级管理员
    public void initSuperAdmins() {
        SuperAdmin admin1 = new SuperAdmin("wxid_ytpc72mdoskt22", "凡", "2014264913", "98e21c89ae5610240ec3f5f575f86a59", "3dcb6b23a1104639ac433fd07adb6dfb");
        super_admins.put(admin1.getWxid() + admin1.getUnionId(), admin1);
        jdidToWxidMap.put(admin1.getUnionId(), admin1.getWxid());
        jdidToRemarkMap.put(admin1.getUnionId(), admin1.getName());

        SuperAdmin admin2 = new SuperAdmin("wxid_yneqf1implxu12", "源", "2025353364", "e3c161242c8a1416fada5b5564d7ee70", "41ae9aabf03b41e6ba309682e36b323e");
        super_admins.put(admin2.getWxid() + admin2.getUnionId(), admin2);
        jdidToWxidMap.put(admin2.getUnionId(), admin2.getWxid());
        jdidToRemarkMap.put(admin2.getUnionId(), admin2.getName());

        SuperAdmin admin3 = new SuperAdmin("wxid_ytpc72mdoskt22", "林琳", "2035096657", "9c2011409f0fc906b73432dd3687599d", "3ceddff403e544a8a2eacc727cf05dab");
        super_admins.put(admin3.getWxid() + admin3.getUnionId(), admin3);
        jdidToWxidMap.put(admin3.getUnionId(), admin3.getWxid());
        jdidToRemarkMap.put(admin3.getUnionId(), admin3.getName());

        SuperAdmin admin4 = new SuperAdmin("wxid_ytpc72mdoskt22", "淑玲", "2036678559", "4dbc8edd74fbb24d537ee64930527e30", "27ee9b5871e547eb83e19027a4ff7e18");
        super_admins.put(admin4.getWxid() + admin4.getUnionId(), admin4);
        jdidToWxidMap.put(admin4.getUnionId(), admin4.getWxid());
        jdidToRemarkMap.put(admin4.getUnionId(), admin4.getName());

        SuperAdmin admin5 = new SuperAdmin("wxid_ytpc72mdoskt22", "老妈", "2035140236", "5cc8da6a55842330775fad4ee9ebf47a", "c4aebcd408924143a75463781f6acd7c");
        super_admins.put(admin5.getWxid() + admin5.getUnionId(), admin5);
        jdidToWxidMap.put(admin5.getUnionId(), admin5.getWxid());
        jdidToRemarkMap.put(admin5.getUnionId(), admin5.getName());

        SuperAdmin admin6 = new SuperAdmin("wxid_ytpc72mdoskt22", "心琳", "2019237086", "01381d95e4936f1f3fe643bba2171894", "087c56aa156a4c20be280195be8b3eda");
        super_admins.put(admin6.getWxid() + admin6.getUnionId(), admin6);
        jdidToWxidMap.put(admin6.getUnionId(), admin6.getWxid());
        jdidToRemarkMap.put(admin6.getUnionId(), admin6.getName());

        SuperAdmin admin7 = new SuperAdmin("wxid_ytpc72mdoskt22", "燕敏", "2033493067", "66618e24a5e9f44156253c4eb9892388", "15846e2334934482a703417d5058f842");
        super_admins.put(admin7.getWxid() + admin7.getUnionId(), admin7);
        jdidToWxidMap.put(admin7.getUnionId(), admin7.getWxid());
        jdidToRemarkMap.put(admin7.getUnionId(), admin7.getName());
        //370|10:39:16|wxid_kr145nk7l0an31|发出私聊|【发送】wxid_gca9mnidqhkq11：<msg><emoji fromusername="wxid_kr145nk7l0an31" tousername="wxid_gca9mnidqhkq11" type="2" androidmd5="757143031ca266efd91d80282ff712a2" androidlen="1179" aeskey="da0fc6265e1c4a34be48793765b23625" encrypturl="http://vweixinf.tc.qq.com/110/20402/stodownload?m=929b1e2005a43d19d6b83bc838c1d344&amp;filekey=3043020101042f302d02016e0402535a0420393239623165323030356134336431396436623833626338333863316433343402024640040d00000004627466730000000132&amp;hy=SZ&amp;storeid=264422c1f000dce3a74f42d4d0000006e02004fb2535a07393970b6bcbbaed&amp;ef=2&amp;bizid=1022" externurl="http://vweixinf.tc.qq.com/110/20403/stodownload?m=3b7e84fd88d3da4b665c17e0a54317d2&amp;filekey=3043020101042f302d02016e0402535a04203362376538346664383864336461346236363563313765306135343331376432020204a0040d00000004627466730000000132&amp;hy=SZ&amp;storeid=264422c1f000e578f74f42d4d0000006e03004fb3535a07393970b6bcbbaf8&amp;ef=3&amp;bizid=1022" externmd5="afb197c2f679456c2506809e3fc1c56a"/></msg>
        SuperAdmin admin8 = new SuperAdmin("wxid_gca9mnidqhkq11", "梓豪", "1003068753", "e335738c819a7c3343d4dde52c393880", "b56abdd9b177466ba2afb6f0ee89709c");
        super_admins.put(admin8.getWxid() + admin8.getUnionId(), admin8);
        jdidToWxidMap.put(admin8.getUnionId(), admin8.getWxid());
        jdidToRemarkMap.put(admin8.getUnionId(), admin8.getName());


        /* 内部管理群 */

        // 方案
        //chatRoom_admin.add("50400969285@chatroom");
        // 闲鱼
        chatRoom_admin.add("50203565991@chatroom");
        // 什么都发
        chatRoom_admin.add("49533691813@chatroom");
        // 方案交互群
        chatRoom_admin.add("44960628585@chatroom");
        //评价生成群
        chatRoom_admin.add("47484514467@chatroom");


        /* 线报采集来源群 */
        // 玩了买
        chatRoom_xb.put("23143922156@chatroom", "玩乐买");
    //    舵手群（48621589056@chatroom）："曲莉亚@河南慧推电子商务有限公司、齐学法@河南慧推电子商务有限公司"为企业微信用户，<_wc_custom_link_  href="https://weixin.qq.com/cgi-bin/newreadtemplate?t=work_wechat/about_group">了解更多</_wc_custom_link_>。
        chatRoom_xb.put("48621589056@chatroom", "舵手");

    //发送通知到微信
        sendTextMessage(default_super_admin_wxid, "Jarvis 重启完成 [亲亲][亲亲][亲亲] ", 1, default_super_admin_wxid, false);

    }

    // 获取微信列表
    public JSONObject getWxList() {
        WxReqDate wxReqDate = createWxReqData(WXReqType.GET_WX_LIST);
        String responseStr = HttpRequest.post(WX_BASE_URL).body(JSON.toJSONString(wxReqDate)).execute().body();
        if (ObjectUtil.isNotEmpty(responseStr)) {
            return JSON.parseObject(responseStr);
        } else {
            return null;
        }

    }

    public void sendTextMessage(String wxid, String content, Integer msgType, String fromwxid, Boolean hiddenTime) {
        // 全部打印
        //logger.info("发送文本消息 msgType: {} wxid: {} fromwxid: {} content: {}", msgType, wxid, fromwxid, content);
        // 先在content顶部插入时间戳
        // 因为引入了消息队列，所以在每条消息都加上时间戳 格式化成 yyyy-MM-dd HH:mm:ss
        if (!hiddenTime) {
            content = "[ " + DateUtil.format(new Date(), "HH:mm:ss yyyy-MM-dd") + " ] \r\n" + content;
        }

        // 如果是自己的微信，所有信息都加上少爷
        //if (wxid.equals(super_admin_wxid) || fromwxid.equals(super_admin_wxid)) {
        //    content = "超管： 凡神 ！\r\n" + content;
        //}
        List<String> strings = splitStringByLength(content, 4096);
        int count = 1;
        for (String string : strings) {

            if (strings.size() > 1) {
                string = "---长消息---第：" + count + "条 " + "\r" + string;
            }
            count++;

            //JSONObject wxList = getWxList();
            //JSONObject wxBotInfo = (JSONObject) wxList.getJSONArray("result").get(0);
            //botWxid = wxBotInfo.getString("wxid");
            //
            ////
            WxReqDate wxReqDate = createWxReqData(WXReqType.SEND_TEXT_MESSAGE);
            JSONObject data = new JSONObject();
            //if ((msgType.equals(1))) {
            //    jsonObject.put("wxid", wxid);
            //    content = content;
            //}
            ////[@,wxid=对象wxid,nick=对象昵称,isAuto=true]
            //if ((msgType.equals(2))) {
            //    jsonObject.put("wxid", fromwxid);
            //    content = "[@,wxid=" + wxid + ",nick=6,isAuto=true] " + content;
            //}
        /*
        * {
            "wxid": "filehelper",
            "msg": "666大佬~"
          }*/
            data.put("msg", string);
            data.put("wxid", wxid);
            wxReqDate.setData(data);
            // wxReqDate 转成 JSONObject
            JSONObject message = JSON.parseObject(JSON.toJSONString(wxReqDate));


            //System.out.println(JSON.toJSONString(jsonObject));
            //wxReqDate.setData(jsonObject);
            if (Util.isNotEmpty(wxid)) {
                // 把消息发送到RocketMQ，使用'wx-message'作为topic，jsonObject作为消息内容。
                messageProducerService.sendMessage(message);
            }
        }

    }

    public void sendImageMessage(String wxid, String imagePath) {
        WxReqDate wxReqDate = createWxReqData(WXReqType.SEND_IMAGE);
        JSONObject data = new JSONObject();
        data.put("wxid", wxid);
        data.put("path", imagePath);
        String[] split = imagePath.split("/");
        data.put("fileName", split[split.length - 1]);
        wxReqDate.setData(data);
        JSONObject message = JSON.parseObject(JSON.toJSONString(wxReqDate));

        if (Util.isNotEmpty(wxid)) {
            // 把消息发送到RocketMQ，使用'wx-message'作为topic，jsonObject作为消息内容。
            messageProducerService.sendMessage(message);
        }
    }

    /**
     * {
     * "type": "Q0016",
     * "data": {
     * "wxid": "wxid_3sx9sjgq99kd22",
     * "transferid": "1000050001202207161417697440336"
     * }
     * }
     */
    public JSONObject queRenShouKuan(String wxid, String transferid) {
        String botWxid = "";
        JSONObject wxList = getWxList();
        JSONObject wxBotInfo = (JSONObject) wxList.getJSONArray("result").get(0);
        botWxid = wxBotInfo.getString("wxid");
        WxReqDate wxReqDate = createWxReqData(WXReqType.CONFIRM_RECEIPT);
        HashMap<String, String> body = new HashMap<>();
        body.put("wxid", wxid);
        body.put("transferid", transferid);
        JSONObject jsonObject = new JSONObject(body);
        wxReqDate.setData(jsonObject);
        String responseStr = HttpRequest.post(WX_BASE_URL + "?wxid=" + botWxid).body(JSON.toJSONString(wxReqDate)).execute().body();
        logger.info("确认收款结果：responseStr: {}", responseStr);
        if (ObjectUtil.isNotEmpty(responseStr)) {
            return JSON.parseObject(responseStr);
        } else {
            return null;
        }

    }

    //private JSONObject sendWxReq(WxReqDate wxReqDate) {
    //    if (wxReqDate == null) {
    //        return null;
    //    } else {
    //        logger.info("wxReqDate: {}", wxReqDate);
    //
    //            String responseStr = HttpRequest.post(WX_BASE_URL).body(JSON.toJSONString(wxReqDate)).execute().body();
    //            if (ObjectUtil.isNotEmpty(responseStr)) {
    //                JSONObject jsonObject = JSON.parseObject(responseStr);
    //                //WxResponse wxResponse = JSON.parseObject(responseStr, WxResponse.class);
    //                //System.out.println(wxResponse);
    //                //if (Objects.equals(String.valueOf(wxResponse.getCode()), "200")) {
    //                //    return wxResponse.getData();
    //                //}
    //                //JSONObject jsonObject = HttpUtil.sendPost(url, wxReqDate.getData());
    //                return jsonObject;
    //            }
    //        }
    //
    //        return null;
    //    }
    //}

    public WxReqDate createWxReqData(WXReqType wxReqType) {

        WxReqDate wxReqDate = new WxReqDate(wxReqType.getType(), null);

        return wxReqDate;
    }

    @Scheduled(cron = "0 * * * * ?")
    public void checkWxStatus() {
        WxReqDate wxReqDate = createWxReqData(WXReqType.GET_WX_STATUS);
        JSONObject data = new JSONObject();
        data.put("wxid", default_bot_wxid);
        wxReqDate.setData(data);
        String responseStr = HttpRequest.post(WX_BASE_URL).body(JSON.toJSONString(wxReqDate)).execute().body();
        if (ObjectUtil.isNotEmpty(responseStr)) {
            JSONObject jsonObject = JSON.parseObject(responseStr);
            /**
             * {
             *   "code": 200,
             *   "msg": "正常",
             *   "result": {
             *     "startTimeStamp": "1716467892",
             *     "startTime": "2024年5月23日20时38分12秒",
             *     "runTime": "3分10秒",
             *     "recv": 0,
             *     "send": 0,
             *     "wxNum": "DaenPro",
             *     "nick": "小鹿\\uD83D\\uDE00\\uD83D\\uDE00摸",
             *     "wxid": "wxid_nq6r0w9v12612"
             *   },
             *   "wxid": "wxid_nq6r0w9v12612",
             *   "port": 7799,
             *   "pid": 18892,
             *   "flag": "7888",
             *   "timestamp": "1716468082967"
             * }
             * */
            Integer code = jsonObject.getInteger("code");
            if (code == 500) {
                if (sendTimes > 3) {
                    return;
                }
                wxTsUtil.sendCriticalAlert("微信状态异常", jsonObject.getString("msg"));
                sendTimes++;
            } else if (code == 200) {
                sendTimes = 0;
            }
        } else {
            // 新建格式化日期
            DateFormat dateFormat = new SimpleDateFormat("yyyy年MM月dd日HH时mm分ss秒");
            wxTsUtil.sendCriticalAlert("千寻框架状态异常", dateFormat.format(new Date()));
        }

    }

    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    private static class WxReqDate {
        //{
        //    "type": "X0000",
        //        "data": {}
        //}
        private String type;
        private JSONObject data;

    }

    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    public class SuperAdmin {
        private String wxid;
        private String name;
        // 联盟ID
        private String unionId;
        private String appKey;
        private String secretKey;
    }

    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    private class WxResponse {
        /**
         * {
         * "code": 200,
         * "msg": "操作成功",
         * "result": {},
         * "wxid": "wxid_3sq4tklb6c3121",
         * "port": 7305,
         * "pid": 12384,
         * "flag": "7777",
         * "timestamp": "1657462661814"
         * }
         */
        private Integer code;
        private String msg;
        private JSONObject result;
        private String wxid;
        private Integer port;
        private Integer pid;
        private String flag;
        private String timestamp;
    }

}
