import puppeteer from "puppeteer";
import fs from "fs";
import path from "path";
import { pingDailyPuzzleUpdated } from "../services/indexingService";
import { launchBrowser } from "./puppeteer-launcher";
export async function generateSportsConnectionsHints() {
  const url = "https://ladypuzzle.pro/sports-connections-hints-answers";

  try {
       const browser = await launchBrowser();

    const page = await browser.newPage();
    page.setDefaultNavigationTimeout(90000);

    // ✅ Increase compatibility (Cloudflare)
    await page.setBypassCSP(true);
    await page.setJavaScriptEnabled(true);

    // ✅ Set user-agent (prevents bot detection)
    await page.setExtraHTTPHeaders({
      "User-Agent":
        "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36",
    });

    // ✅ Try navigation twice
    try {
      await page.goto(url, { waitUntil: "domcontentloaded" });
    } catch (e) {
      console.log("Navigation failed, retrying...");
      await new Promise(res => setTimeout(res, 4000));
      await page.goto(url, { waitUntil: "domcontentloaded" });
    }

    // ✅ Wait for puzzle groups
    await page.waitForSelector(".group-members", { timeout: 60000 });

    // ✅ Reveal words
    await page.evaluate(() => {
      const btns = Array.from(document.querySelectorAll("button"));
      const reveal = btns.find(b =>
        b.innerText.toLowerCase().includes("reveal")
      );
      if (reveal) reveal.click();
    });

    await new Promise(res => setTimeout(res, 1500));

    // ✅ SCRAPE CONTENT
    const categories = await page.evaluate(() => {
      const groups = Array.from(
        document.querySelectorAll("div[data-group-index]")
      );

      return groups.map(g => {
        const style = g.getAttribute("style") || "";

        const titleBtn = g.querySelector(".btn.btn-wide");
        const ai_hint = titleBtn ? titleBtn.textContent!.trim() : "";

        const wordBtns = Array.from(
          g.querySelectorAll(".group-members button")
        );

        const cards = wordBtns.map(btn => ({
          content: btn.textContent!.trim(),
        }));

        return { color: style, ai_hint, cards };
      });
    });

    await browser.close();

    const valid = categories.filter(c => c.cards.length > 0);

    const date = new Date().toISOString().split("T")[0];

    const sportsData = {
      id: Date.now(),
      date,
      categories: valid,
    };

    const isProduction = process.env.NODE_ENV === "production";
    const baseDir = path.join(__dirname, "..", "..", "..");

    const hintsDir = isProduction
      ? path.join(baseDir, "nytsolvers", "dist", "client", "hints", "sports-connections")
      : path.join(baseDir, "project", "public", "hints", "sports-connections");
    if (!fs.existsSync(hintsDir)) fs.mkdirSync(hintsDir, { recursive: true });

    fs.writeFileSync(
      path.join(hintsDir, `${date}.json`),
      JSON.stringify(sportsData, null, 2)
    );

    console.log("Sports Connections hints successfully generated:", hintsDir);

    // Trigger search engine indexing (Google Indexing API & Bing IndexNow)
    await pingDailyPuzzleUpdated("connections-sports-hints", date).catch((err: any) =>
      console.error("[Sports Connections] Error pinging search indexing:", err.message)
    );

  } catch (err) {
    console.error("Error generating Sports Connections hints:", err);
  }
}

if (require.main === module) {
  generateSportsConnectionsHints();
}
