import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import org.apache.http.HttpEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;

import java.nio.charset.StandardCharsets;


public class WechatBot {

    static  String message = "这是一个测试消息,用于验证企业微信群机器人的消息发送功能测试结束。\"+\"这是一个测试消息,用于验证企业微信群机器人的消息发送功能测试结束。\"+\"这是一个测试消息,用于验证企业微信群机器人的消息发送功能。\n\n" +
            "测试内容包括多个换行符,以确保消息能够正确处理并发送。\n\n" +
            "第一行内容\n" +
            "第二行内容\n" +
            "第三行内容\n\n" +
            "这是第四行内容,确保消息格式和内容的完整性。\n\n" +
            "测试结束。\n"+"这是一个测试消息,用于验证企业微信群机器人的消息发送功能测试结束。\"+\"这是一个测试消息,用于验证企业微信群机器人的消息发送功能测试结束。\"+\"这是一个测试消息,用于验证企业微信群机器人的消息发送功能。\n\n" +
            "测试内容包括多个换行符,以确保消息能够正确处理并发送。\n\n" +
            "第0行内容\n" +
            "第0行内容\n" +
            "第0行内容\n\n" +
            "这是第0行内容,确保消息格式和内容的完整性。\n\n" +
            "测试结束。\n"+"这是一个测试消息,用于验证企业微信群机器人的消息发送功能测试结束。\"+\"这是一个测试消息,用于验证企业微信群机器人的消息发送功能测试结束。\"+\"这是一个测试消息,用于验证企业微信群机器人的消息发送功能。\n\n" +
            "测试内容包括多个换行符,以确保消息能够正确处理并发送。\n\n" +
            "第1行内容\n" +
            "第1二行内容\n" +
            "第1三行内容\n\n" +
            "这是第1四行内容,确保消息格式和内容的完整性。\n\n" +
            "测试结束。\n"+"这是一个测试消息,用于验证企业微信群机器人的消息发送功能测试结束。\"+\"这是一个测试消息,用于验证企业微信群机器人的消息发送功能测试结束。\"+\"这是一个测试消息,用于验证企业微信群机器人的消息发送功能。\n\n" +
            "测试内容包括多个换行符,以确保消息能够正确处理并发送。\n\n" +
            "第2一行内容\n" +
            "第2二行内容\n" +
            "第2三行内容\n\n" +
            "这是第2四行内容,确保消息格式和内容的完整性。\n\n" +
            "测试结束。\n"+"这是一个测试消息,用于验证企业微信群机器人的消息发送功能测试结束。\"+\"这是一个测试消息,用于验证企业微信群机器人的消息发送功能测试结束。\"+\"这是一个测试消息,用于验证企业微信群机器人的消息发送功能。\n\n" +
            "测试内容包括多个换行符,以确保消息能够正确处理并发送。\n\n" +
            "第3一行内容\n" +
            "第3二行内容\n" +
            "第3三行内容\n\n" +
            "这是第3四行内容,确保消息格式和内容的完整性。\n\n" +
            "测试结束。"+"这是一个测试消息,用于验证企业微信群机器人的消息发送功能测试结束。\"+\"这是一个测试消息,用于验证企业微信群机器人的消息发送功能测试结束。\"+\"这是一个测试消息,用于验证企业微信群机器人的消息发送功能。\n\n" +
            "测试内容包括多个换行符,以确保消息能够正确处理并发送。\n\n" +
            "第4一行内容\n" +
            "第4二行内容\n" +
            "第4三行内容\n\n" +
            "这是第4四行内容,确保消息格式和内容的完整性。\n\n" +
            "测试结束。"+"这是一个测试消息,用于验证企业微信群机器人的消息发送功能测试结束。\"+\"这是一个测试消息,用于验证企业微信群机器人的消息发送功能测试结束。\"+\"这是一个测试消息,用于验证企业微信群机器人的消息发送功能。\n\n" +
            "测试内容包括多个换行符,以确保消息能够正确处理并发送。\n\n" +
            "第5一行内容\n" +
            "第5二行内容\n" +
            "第5三行内容\n\n" +
            "这是第5四行内容,确保消息格式和内容的完整性。\n\n" +
            "测试结束。"+"这是一个测试消息,用于验证企业微信群机器人的消息发送功能测试结束。\"+\"这是一个测试消息,用于验证企业微信群机器人的消息发送功能测试结束。\"+\"这是一个测试消息,用于验证企业微信群机器人的消息发送功能。\n\n" +
            "测试内容包括多个换行符,以确保消息能够正确处理并发送。\n\n" +
            "第6一行内容\n" +
            "第6二行内容\n" +
            "第6三行内容\n\n" +
            "这是第6四行内容,确保消息格式和内容的完整性测试结束。\"+\"这是一个测试消息,用于验证企业微信群机器人的消息发送功能测试结束。\"+\"这是一个测试消息,用于验证企业微信群机器人的消息发送功能。\n\n" +
            "测试结束。";
    public static void main(String[] args) {
        noticeSplittedMessages(message,"\n","https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=932af38b-7d7b-4b5c-befb-ab5bta8dcu74");
    }

    private static final int MAX_LENGTH = 4096;

    /**
     * 分段通知(适用于消息超过限制的内容)
     *
     * @param message 发送的消息
     * @param splitBy 以什么作为分割标识,默认以“\n”
     * @param robot   机器人 webhook
     * @return true 如果所有消息段都成功发送,否则返回 false
     */
    public static boolean noticeSplittedMessages(String message, String splitBy, String robot) {
        // 默认分割标识
        splitBy = (splitBy == null || splitBy.isEmpty()) ? "\n" : splitBy;

        // 处理超出长度的消息
        while (message.getBytes(StandardCharsets.UTF_8).length > MAX_LENGTH) {
            int currentByteLength = 0;
            int lastSplitIndex = -1;

            // 找到最后一个分割标识的索引,并计算字节长度
            for (int i = 0; i < message.length(); i++) {
                char currentChar = message.charAt(i);
                currentByteLength += String.valueOf(currentChar).getBytes(StandardCharsets.UTF_8).length;

                if (currentByteLength > MAX_LENGTH) {
                    break;
                }

                if (message.substring(0, i + 1).endsWith(splitBy)) {
                    lastSplitIndex = i + 1;
                }
            }

            // 如果没有找到分割标识或当前字节长度未超过MAX_LENGTH,直接在当前字节长度处分割
            if (lastSplitIndex == -1 || currentByteLength <= MAX_LENGTH) {
                lastSplitIndex = message.substring(0, MAX_LENGTH).getBytes(StandardCharsets.UTF_8).length;
            }

            // 获取分割的消息部分
            String partToSend = message.substring(0, lastSplitIndex);

            // 发送当前消息部分
            noticeQWechat(robot,"markdown",partToSend);

            // 更新剩余消息
            message = message.substring(lastSplitIndex);
        }

        // 发送剩余的消息
        return noticeQWechat(robot,"markdown",message);
    }

    /**
     * 发送到企微机器人
     * @param webhook
     * @param msgType
     * @param content
     * @return
     */
    public static boolean noticeQWechat(String webhook, String msgType, String content) {
        // Log the message information
        System.out.println("向:" + webhook.substring(webhook.length()-30) + " 发送消息:msgType=" + msgType + " 内容:" + content.substring(0, Math.min(content.length(), 50)));

        // Prepare the JSON payload
        JSONObject json = new JSONObject();
        json.put("msgtype", msgType);
        JSONObject msg = new JSONObject();
        msg.put("content", content);
        json.put(msgType, msg);

        // Send the HTTP request
        try (CloseableHttpClient client = HttpClients.createDefault()) {
            HttpPost post = new HttpPost(webhook);
            post.setEntity(new StringEntity(json.toJSONString(), ContentType.APPLICATION_JSON));

            try (CloseableHttpResponse response = client.execute(post)) {
                HttpEntity entity = response.getEntity();
                String resp = EntityUtils.toString(entity);

                JSONObject responseJson = JSON.parseObject(resp);
                if (!"200".equals(responseJson.getString("status"))) {
                    return false;
                }
            }
        } catch (Exception e) {
            e.printStackTrace(); // Or use a logging framework
            return false;
        }
        return true;
    }


}