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

puppeteer.use(StealthPlugin());

async function testYangMingScraping() {
  console.log("\n🧪 Testing Yang Ming Scraping...\n");

  const containerNumber = "YMLU5511687";
  const url = "https://www.yangming.com/en/esolution/cargo_tracking";

  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 form to load...");
    await new Promise((resolve) => setTimeout(resolve, 2000));

    // Step 1: Find and fill the input field
    console.log(`📝 Entering container number: ${containerNumber}`);
    const input = await page.$('input[type="text"]');
    if (input) {
      await input.type(containerNumber, { delay: 50 });
      console.log("✅ Entered container number");
    } else {
      console.log("⚠️ Input field not found");
    }

    // Step 2: Press Enter to search
    console.log("⏳ Pressing Enter to search...");
    await page.keyboard.press("Enter");

    // Wait for results
    console.log("⏳ Waiting for results (15 seconds)...");
    await new Promise((resolve) => setTimeout(resolve, 15000));

    const html = await page.content();
    fs.writeFileSync("yangming-page.html", html);
    console.log("✅ Page loaded successfully");
    console.log("📄 HTML saved to: yangming-page.html\n");

    // Extract ETA date from "Discharged" event
    console.log("🔍 Extracting date from 'Discharged' event...");
    
    const dateData = await page.evaluate(() => {
      // Find all table rows
      const rows = Array.from(document.querySelectorAll('tr'));
      
      for (const row of rows) {
        const cells = row.querySelectorAll('td');
        if (cells.length >= 2) {
          const dateCell = cells[0]?.textContent?.trim();
          const eventCell = cells[1]?.textContent?.trim();
          
          if (eventCell === 'Discharged' && dateCell) {
            return {
              date: dateCell,
              event: eventCell,
            };
          }
        }
      }
      return null;
    });

    if (dateData) {
      console.log(`✅ Found: ${dateData.event}`);
      console.log(`   Date: ${dateData.date}`);
      
      // Convert from "2026/05/30 20:27" to "2026-05-30"
      const dateMatch = dateData.date.match(/(\d{4})\/(\d{2})\/(\d{2})/);
      if (dateMatch) {
        const formattedDate = `${dateMatch[1]}-${dateMatch[2]}-${dateMatch[3]}`;
        console.log(`   Formatted: ${formattedDate}\n`);
      }
    } else {
      console.log("❌ Could not find 'Discharged' event\n");
    }

    await browser.close();
  } catch (error) {
    console.error("Error:", error instanceof Error ? error.message : error);
    if (browser) await browser.close();
  }
}

testYangMingScraping();
