package com.ruoyi.bid.util;

import com.microsoft.playwright.*;
import com.ruoyi.bid.domain.BidInfo;

import java.text.DateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * 招投标系统 - 低仿真核心链路模型
 * 模拟功能：抓取 -> 清洗 -> 智能筛选 -> 模拟报警
 */
public class BidSystemMVP3 {
    // ================= 配置区域 =================
// 目标日期：实际使用时改成 LocalDate.now().format(...)
// 这里写死 20251208 是为了配合您刚才看到的真实数据
    private static final String TARGET_DATE_STR = "20251209";

    // 基础 URL 模板 (注意 %s 占位符)
    private static final String BASE_URL = "http://www.ccgp.gov.cn/cggg/zygg/index%s.htm";

    // 正则表达式：用于从 URL 中提取日期 (匹配 t20251208 这种格式)
    private static final Pattern DATE_PATTERN = Pattern.compile("t(\\d{8})_");

    public static  List<BidInfo> getBidInfos(String url, Date nowDate){
        List<BidInfo> bidInfos = new ArrayList<>();

        System.out.println("========== 系统启动：智能时间翻页模式 ==========");
        System.out.println("目标日期：" + TARGET_DATE_STR);

        try (Playwright playwright = Playwright.create()) {
            // 启动浏览器
            Browser browser = playwright.chromium().launch(new BrowserType.LaunchOptions()
                    .setChannel("chrome") // 如果报错改成 "msedge"
                    .setHeadless(false)
                    .setSlowMo(500));

            Page page = browser.newPage();

            int pageNum = 0; // 0 代表第一页(index.htm), 1 代表第二页(index_1.htm)
            boolean keepRunning = true;
            int totalCount = 0;

            while (keepRunning) {
                // 1. 构造当前页 URL
                String currentUrl;
                if (pageNum == 0) {
                    currentUrl = String.format(BASE_URL, ""); // 第一页
                } else {
                    currentUrl = String.format(BASE_URL, "_" + pageNum); // index_1.htm
                }

                System.out.println("\n>> [第 " + (pageNum + 1) + " 页] 正在访问: " + currentUrl);

                try {
                    page.navigate(currentUrl);
                    // 智能等待，不再死等 5 秒，而是等内容加载
                    page.waitForLoadState();
                    // 稍微缓冲一下，防止反爬
                    page.waitForTimeout(2000);

                } catch (Exception e) {
                    System.err.println("   页面访问失败，停止翻页。");
                    break;
                }

                // 2. 扫描本页所有链接
                Locator links = page.locator("a");
                int count = links.count();
                int todayCountInThisPage = 0; // 统计这一页有多少今天的

                for (int i = 0; i < count; i++) {
                    Locator item = links.nth(i);
                    if (!item.isVisible()) continue;

                    String href = item.getAttribute("href");
                    String title = item.innerText().trim();

                    // 过滤无效链接
                    if (href == null || title.length() < 5) continue;

                    // --- 核心：从 URL 提取日期 ---
                    // 链接长这样：./zbgg/202512/t20251208_25880773.htm
                    Matcher matcher = DATE_PATTERN.matcher(href);

                    if (matcher.find()) {
                        String urlDate = matcher.group(1); // 提取出 20251208

                        // 逻辑判定
                        if (urlDate.equals(TARGET_DATE_STR)) {
                            // A. 是今天的 -> 进一步关键词筛选
                            if (shouldSave(title)) {
                                System.out.println("[★ 收录] " + title);
                                System.out.println("       日期: " + urlDate + " | 链接: " + fixLink(href));
                                totalCount++;
                                todayCountInThisPage++;
                                BidInfo info = new BidInfo();
                                info.setTitle(title);
                                //  info.setFbDate(urlDate);
                                info.setLink(href);
                                info.setTitle(title);
                                info.setSourceSite(currentUrl);
                                bidInfos.add(info);
                            }
                        } else if (urlDate.compareTo(TARGET_DATE_STR) < 0) {
                            // B. 比今天小 (是以前的) -> 触发熔断
                            // 注意：有时候置顶公告可能是旧的，所以我们不能遇到一个旧的就立刻停
                            // 策略：如果这一页大部分都是旧的，或者连续遇到旧的，才停。
                            // 这里为了简单，我们打印出来观察一下
                            // System.out.println("   [旧闻] " + urlDate + " - " + title);
                        }
                    }
                }

                // 3. 翻页决策
                if (todayCountInThisPage == 0 && pageNum > 0) {
                    // 如果这一页一条今天的数据都没有（且不是第一页），说明已经翻到旧数据区了
                    System.out.println(">> 本页无今日数据，触发【时间熔断】，停止抓取！");
                    keepRunning = false;
                } else {
                    System.out.println(">> 本页分析完毕，准备翻下一页...");
                    pageNum++;

                    // 安全锁：防止无限翻页 (最多翻20页)
                    if (pageNum > 20) {
                        System.out.println(">> 达到最大页数限制，停止。");
                        keepRunning = false;
                    }
                }
            }

            System.out.println("\n========== 采集结束 ==========");
            System.out.println("共捕获今日 (" + TARGET_DATE_STR + ") 商机: " + totalCount + " 条");

            // 停留 5 秒后关闭
            page.waitForTimeout(5000);

        } catch (Exception e) {
            e.printStackTrace();
        }
        return bidInfos;
    }



    // 关键词筛选
    private static boolean shouldSave(String title) {
        return title.contains("公告") || title.contains("中标") || title.contains("采购");
    }

    // 修复相对链接
    private static String fixLink(String link) {
        if (!link.startsWith("http")) {
            return "http://www.ccgp.gov.cn/cggg/zygg/" + link.replace("./", "");
        }
        return link;
    }

}