import puppeteer from "puppeteer-extra";
import StealthPlugin from "puppeteer-extra-plugin-stealth";
import * as fs from "fs";

puppeteer.use(StealthPlugin());

// Encode to Base64 for MSC URL
function encodeMscParams(containerNumber: string): string {
  const params = `trackingNumber=${containerNumber}&trackingMode=0`;
  return Buffer.from(params).toString("base64");
}

async function testMscScraping() {
  console.log("\n🧪 Testing MSC Scraping...\n");

  const containerNumber = "MEDU9614738";
  const encodedParams = encodeMscParams(containerNumber);
  const url = `https://www.msc.com/en/track-a-shipment?params=${encodedParams}`;

  console.log(`📍 Container: ${containerNumber}`);
  console.log(`🔗 URL: ${url}\n`);

  let browser;

  try {
    browser = await puppeteer.launch({
      headless: true,
      args: [
        "--no-sandbox",
        "--disable-setuid-sandbox",
        "--disable-blink-features=AutomationControlled",
      ],
    });

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

    // Set realistic headers
    await page.setUserAgent(
      "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"
    );
    await page.setViewport({ width: 1920, height: 1080 });

    console.log("🌐 Loading page...");
    await page.goto(url, { waitUntil: "networkidle2" });

    console.log("⏳ Waiting for content to load...");
    await new Promise((resolve) => setTimeout(resolve, 3000));

    const html = await page.content();

    // Save HTML for inspection
    fs.writeFileSync("msc-page.html", html);
    console.log("✅ Page loaded successfully");
    console.log("📄 HTML saved to: msc-page.html\n");

    // Check for key elements
    console.log("🔍 Checking for key elements:");
    console.log(
      `  - Contains container number: ${html.includes(containerNumber) ? "✅" : "❌"}`
    );
    console.log(
      `  - Contains "event.Date": ${html.includes("event.Date") ? "✅" : "❌"}`
    );
    console.log(
      `  - Contains date pattern (DD/MM/YYYY): ${/\d{2}\/\d{2}\/\d{4}/.test(html) ? "✅" : "❌"}\n`
    );

    // Extract date from LADEN event
    // Find all steps and get the one containing both event.Date and LADEN detail
    const ladenRegex = /<div[^>]*msc-flow-tracking__step[^>]*>[\s\S]*?event\.Date[^>]*>(\d{2})\/(\d{2})\/(\d{4})[\s\S]*?LADEN[\s\S]*?<\/div>\s*(?=<template|<div)/;
    const match = html.match(ladenRegex);

    if (match) {
      const day = match[1];
      const month = match[2];
      const year = match[3];
      const formatted = `${year}-${month}-${day}`;
      console.log(`✅ LADEN event date extracted: ${day}/${month}/${year}`);
      console.log(`✅ Formatted date (YYYY-MM-DD): ${formatted}`);
    } else {
      console.log("⚠️  LADEN event not found, trying alternative...");

      // Fallback: Extract first event date
      const dateRegex = /event\.Date">(\d{2})\/(\d{2})\/(\d{4})<\/span>/;
      const altMatch = html.match(dateRegex);

      if (altMatch) {
        const formatted = `${altMatch[3]}-${altMatch[2]}-${altMatch[1]}`;
        console.log(`✅ First event date extracted: ${formatted}`);
      } else {
        console.log("❌ No date pattern found");
      }
    }
  } catch (error) {
    console.error("❌ Error:", error);
  } finally {
    if (browser) {
      await browser.close();
    }
  }
}

testMscScraping();
