import { IncomingMessage, ServerResponse } from "http";
import * as express from "express";
import { Request, Response, NextFunction } from "express";
import puppeteer from "puppeteer";

const delay = (ms: number) => new Promise(resolve => setTimeout(resolve, ms));

export const proxyThroughPuppeteerOrig = async (req: Request, res: Response, targetUrl: string) => {
  try {
    const browser = await puppeteer.launch({ 
      headless: true, 
      args: ['--no-sandbox', '--disable-setuid-sandbox'],
      executablePath: "/Applications/Google Chrome.app/Contents/MacOS/Google Chrome" });
    const page = await browser.newPage();
    console.log("Puppeteer navigating to:", targetUrl);
    await page.goto(targetUrl, { waitUntil: "networkidle2" });
    // Use delay instead of waitForTimeout
    await delay(900); // Wait for 900 ms

    // Rewrite links dynamically
    // await page.evaluate(() => {
    //     document.querySelectorAll("a").forEach((a) => {
    //         if (a.href.startsWith("http")) {
    //             a.href = `/browse/${encodeURIComponent(a.href)}`;
    //         }
    //     });
    // });

    const content = await page.content();
    // await browser.close();

    // Set CORS headers
    res.setHeader('Access-Control-Allow-Origin', '*'); // Allow all origins (use with caution in production)
    res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS'); // Allow methods
    res.setHeader('Access-Control-Allow-Headers', 'Content-Type'); // Allow headers
    res.send(content);
  } catch (error) {
    console.error('Error:', error);
    res.status(500).send('An error occurred while processing the request.');
  }
}

export const proxyThroughPuppeteer = async (req: express.Request, res: express.Response, targetUrl: string) => {
  try {
    const browser = await puppeteer.launch({ 
      headless: false, 
      args: ['--no-sandbox', '--disable-setuid-sandbox'],
      executablePath: "/Applications/Google Chrome.app/Contents/MacOS/Google Chrome" 
    });

    const page = await browser.newPage();
    
    // Intercept requests to rewrite links dynamically
    await page.setRequestInterception(true);
    page.on("request", (interceptedRequest) => {
      if (interceptedRequest.isInterceptResolutionHandled()) return;

      if (interceptedRequest.resourceType() === "script" || interceptedRequest.resourceType() === "xhr") {
        interceptedRequest.continue();
      } else {
        interceptedRequest.continue();
      }
    });

    console.log("Puppeteer navigating to:", targetUrl);
    await page.goto(targetUrl, { waitUntil: "domcontentloaded" });
    await delay(900);

    // Instead of sending raw HTML, pipe the actual page content
    const content = await page.evaluate(() => document.documentElement.outerHTML);
    
    // Close browser instance
    await browser.close();

    res.setHeader('Content-Type', 'text/html');
    res.send(content);
  } catch (error) {
    console.error('Error:', error);
    res.status(500).send('An error occurred while processing the request.');
  }
};