package com.ruoyi.bid.util;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLContext;
import javax.net.ssl.X509TrustManager;
import java.security.SecureRandom;
import java.security.cert.X509Certificate;
import java.util.Arrays;
import java.util.List;

/**
 * 招投标系统 - 低仿真核心链路模型
 * 模拟功能：抓取 -> 清洗 -> 智能筛选 -> 模拟报警
 */
public class BidSystemMVP2 {

    // ================= 配置区域 (针对 chinabidding.org.cn) =================

    // 1. 目标网址
    //private static final String TARGET_URL = "http://www.chinabidding.org.cn/DistrictSite_did_29.html";
    private static final String TARGET_URL = "http://www.chinabidding.org.cn/BidListOfDistrict.aspx?bt=bidNotice&did=29";

    // 2. 选择器 (这是最关键的！)
// 经验推测：这种老网站通常数据在表格(table)里，或者特定的 list 区域
// 建议你先用这个试跑，如果抓不到，我再教你如何精准定位
// 常见的可能是：".list_box li" 或 "table.list_table tr"
// 这里我们先尝试一个宽泛的抓取，把页面所有链接都抓出来看看
    private static final String ITEM_SELECTOR = "a";

    // 3. 关键词
    private static final List<String> POSITIVE_KEYWORDS = Arrays.asList("招标", "采购", "询价", "山西");
    private static final List<String> NEGATIVE_KEYWORDS = Arrays.asList("测试", "暂停");

    public static void main(String[] args) {
        System.out.println("========== 生产环境启动：连接目标网站 ==========");
        System.out.println("目标网址：" + TARGET_URL);

        try {
            // 忽略证书验证 (即使是 HTTP 网站，加上这个也没坏处，防止跳转到 HTTPS 报错)
            trustEveryone();

            // 1. 发起请求 (生产环境核心：伪装 Header)
            Document doc = Jsoup.connect(TARGET_URL)
                    // 伪装成浏览器
                    .userAgent("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36")
                    // 加上 Referer，告诉服务器我是从主页点过来的，不是机器人直接空降的
                    .header("Referer", "http://www.chinabidding.org.cn/")
                    .header("Accept-Language", "zh-CN,zh;q=0.9")
                    .timeout(60000) // 老网站响应慢，给60秒
                    .get();

            System.out.println(">> 连接成功！");
            System.out.println(">> 网页标题：" + doc.title());

            // 生产环境排错：打印一下页面编码，确认是否识别正确
            System.out.println(">> 页面编码：" + doc.charset());

            // 2. 提取数据
            // 针对这个网站，我们先抓取正文中所有带标题的链接，看看结构
           // Elements items = doc.select(ITEM_SELECTOR);
            // 匹配tr中第一个td的后代a标签
            Elements items = doc.select("table.column  a");

            System.out.println(">> 扫描到 " + items.size() + " 个链接，开始清洗...\n");

            int count = 0;
            for (Element item : items) {
               // String title = item.text().trim();  //获取不到内容改用下面方法获取
                String title = item.parent().text().trim();
               // String link = item.attr("abs:href");
                String link = item.select("a").attr("abs:href");

                // 过滤掉太短的标题（比如 "首页"、"更多" 这种无效链接）
                if (title.length() < 6) continue;

                if (shouldAlert(title)) {
                    System.out.println("--------------------------------");
                    System.out.println("【发现商机】" + title);
                    System.out.println("【链接地址】" + link);
                    count++;
                }
            }

            if (count == 0) {
                System.out.println("\n没有匹配到关键词，或者 CSS 选择器(ITEM_SELECTOR) 需要调整。");
                System.out.println("建议：右键网页列表 -> 检查，查看具体的 class 或 id。");
            }

        } catch (Exception e) {
            System.err.println("出错：" + e.getMessage());
            // 如果出现 java.net.SocketTimeoutException，说明网站慢，调大 timeout
        }
    }

    // --- 通用方法保持不变 ---
    public static void trustEveryone() {
        try {
            HttpsURLConnection.setDefaultHostnameVerifier((hostname, session) -> true);
            SSLContext context = SSLContext.getInstance("TLS");
            context.init(null, new X509TrustManager[]{new X509TrustManager() {
                public void checkClientTrusted(X509Certificate[] chain, String authType) {}
                public void checkServerTrusted(X509Certificate[] chain, String authType) {}
                public X509Certificate[] getAcceptedIssuers() { return new X509Certificate[0]; }
            }}, new SecureRandom());
            HttpsURLConnection.setDefaultSSLSocketFactory(context.getSocketFactory());
        } catch (Exception e) { e.printStackTrace(); }
    }

    private static boolean shouldAlert(String title) {
        if (title == null) return false;
        for (String neg : NEGATIVE_KEYWORDS) if (title.contains(neg)) return false;
        for (String pos : POSITIVE_KEYWORDS) if (title.contains(pos)) return true;
        return false;
    }
}