import express from "express";
import puppeteer from "puppeteer";
import { WebSocketServer } from "ws";

const WS_PORT = 3001;

// Start WebSocket server
const wss = new WebSocketServer({ port: WS_PORT });

// WebSocket connection handler
wss.on("connection", async (ws) => {
  console.log("Client connected to WebSocket proxy");

  // Launch Puppeteer
  const browser = await puppeteer.launch({
    headless: false, // Set to true if running on a server
    args: ["--no-sandbox", "--disable-setuid-sandbox"],
  });

  const page = await browser.newPage();

  // Listen for messages from the frontend
  ws.on("message", async (message) => {
    const targetUrl = message.toString();
    console.log("Navigating to:", targetUrl);

    try {
      await page.goto(targetUrl, { waitUntil: "networkidle2" });

      // Inject JavaScript to rewrite links (to route clicks through Puppeteer)
      await page.evaluate(() => {
        document.querySelectorAll("a").forEach((a) => {
          if (a.href.startsWith("http")) {
            a.href = `javascript:window.sendToServer('${a.href}');`;
          }
        });
      });

      // Send page content to frontend
      const content = await page.content();
      ws.send(JSON.stringify({ type: "content", data: content }));
    } catch (error) {
      console.error("Navigation error:", error);
      ws.send(JSON.stringify({ type: "error", data: "Failed to load page" }));
    }
  });

  ws.on("close", async () => {
    console.log("Client disconnected, closing Puppeteer.");
    await browser.close();
  });
});