#!/usr/bin/env node

/**
 * YangMing Scraper Diagnostic Tool
 * 
 * Usage:
 *   npx ts-node scripts/yangming-diagnostic.ts [CONTAINER_NUMBER]
 * 
 * Example:
 *   npx ts-node scripts/yangming-diagnostic.ts YMLU5511687
 */

import * as dotenv from "dotenv";
import path from "path";

// Load environment variables
dotenv.config({
  path: path.resolve(process.cwd(), ".env.local"),
});

async function runDiagnostic() {
  const containerNumber = process.argv[2] || "YMLU5511687";
  
  console.log("\n╔════════════════════════════════════════════════════════════╗");
  console.log("║     🔍 YangMing Scraper Diagnostic Tool                    ║");
  console.log("╚════════════════════════════════════════════════════════════╝\n");
  
  console.log(`📦 Container: ${containerNumber}`);
  console.log(`🌐 URL: https://www.yangming.com/en/esolution/cargo_tracking\n`);

  // Step 1: Check if Puppeteer is available
  console.log("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");
  console.log("Step 1: Checking Puppeteer installation...");
  console.log("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n");

  let puppeteerAvailable = false;
  try {
    const puppeteer = require("puppeteer");
    console.log("✅ Puppeteer found\n");
    puppeteerAvailable = true;
  } catch (e) {
    console.log("❌ Puppeteer not found\n");
    console.log("Install with: npm install puppeteer\n");
    process.exit(1);
  }

  // Step 2: Check Puppeteer-extra
  console.log("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");
  console.log("Step 2: Checking Puppeteer-extra with Stealth plugin...");
  console.log("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n");

  let puppeteerExtra: any = null;
  try {
    puppeteerExtra = require("puppeteer-extra");
    const StealthPlugin = require("puppeteer-extra-plugin-stealth");
    puppeteerExtra.use(StealthPlugin());
    console.log("✅ Puppeteer-extra with Stealth plugin loaded\n");
  } catch (e) {
    console.log("⚠️  Puppeteer-extra not available, using plain Puppeteer\n");
  }

  // Step 3: Launch browser and test scraping
  console.log("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");
  console.log("Step 3: Launching browser and testing scraping...");
  console.log("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n");

  try {
    const puppeteer = require("puppeteer");
    const launcher = puppeteerExtra || puppeteer;

    const browser = await launcher.launch({
      headless: true,
      args: [
        "--no-sandbox",
        "--disable-setuid-sandbox",
        "--disable-dev-shm-usage",
        "--disable-gpu",
      ],
    });

    console.log("✅ Browser launched\n");

    const page = await browser.newPage();
    await page.setViewport({ width: 1920, height: 1080 });
    await page.setUserAgent(
      "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36"
    );

    console.log("📄 Navigating to YangMing tracking page...");
    const startTime = Date.now();
    
    try {
      await page.goto("https://www.yangming.com/en/esolution/cargo_tracking", {
        waitUntil: "networkidle2",
        timeout: 30000,
      });
      
      const loadTime = Date.now() - startTime;
      console.log(`✅ Page loaded in ${loadTime}ms\n`);
    } catch (e) {
      console.log(`⚠️  Page load timed out after 30s (this may be normal)\n`);
    }

    // Wait for input field
    console.log("⏳ Waiting for input field...");
    try {
      await page.waitForSelector('input[type="text"]', { timeout: 5000 });
      console.log("✅ Input field found\n");
    } catch (e) {
      console.log("⚠️  Input field not found immediately (might appear after JS loads)\n");
    }

    // Fill container number
    console.log(`✏️  Filling container number: ${containerNumber}`);
    await page.evaluate((containerNum: string) => {
      const inputs = Array.from(document.querySelectorAll('input[type="text"]'));
      if (inputs.length > 0) {
        (inputs[0] as HTMLInputElement).value = containerNum.toUpperCase();
        inputs[0].dispatchEvent(new Event("input", { bubbles: true }));
        inputs[0].dispatchEvent(new Event("change", { bubbles: true }));
      }
    }, containerNumber);
    console.log("✅ Container number filled\n");

    // Press Enter
    console.log("🔍 Pressing Enter to search...");
    await page.keyboard.press("Enter");
    console.log("✅ Enter pressed\n");

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

    // Extract page content
    console.log("📊 Analyzing page content...\n");
    
    const { bodyText, pageLength, foundPatterns } = await page.evaluate(() => {
      const bodyText = document.body.innerText || document.body.textContent || "";
      
      const patterns = {
        etaAtPort: /ETA\s+at\s+([A-Z\s]+):\s*(\d{4}\/\d{2}\/\d{2}(?:\s+\d{2}:\d{2})?)/i,
        etaWithoutPort: /ETA[^0-9]*(\d{4}\/\d{2}\/\d{2}(?:\s+\d{2}:\d{2})?)/i,
        datePattern: /(\d{4}\/\d{2}\/\d{2})/,
      };

      const foundPatterns: Record<string, boolean> = {};
      for (const [name, pattern] of Object.entries(patterns)) {
        foundPatterns[name] = pattern.test(bodyText);
      }

      return {
        bodyText,
        pageLength: bodyText.length,
        foundPatterns,
      };
    });

    console.log(`📄 Page content length: ${pageLength} characters`);
    console.log(`🔎 Pattern matches:\n`);
    console.log(`   - ETA at [PORT]: YYYY/MM/DD - ${foundPatterns.etaAtPort ? "✅ FOUND" : "❌ NOT FOUND"}`);
    console.log(`   - ETA ... YYYY/MM/DD - ${foundPatterns.etaWithoutPort ? "✅ FOUND" : "❌ NOT FOUND"}`);
    console.log(`   - Generic YYYY/MM/DD - ${foundPatterns.datePattern ? "✅ FOUND" : "❌ NOT FOUND"}\n`);

    // Show sample of page content
    console.log("📝 Page content sample (first 500 characters):");
    console.log("─".repeat(60));
    console.log(bodyText.substring(0, 500));
    console.log("─".repeat(60) + "\n");

    // Try to extract ETA
    const eta = await page.evaluate(() => {
      const bodyText = document.body.innerText || document.body.textContent || "";
      
      let match = bodyText.match(/ETA\s+at\s+([A-Z\s]+):\s*(\d{4}\/\d{2}\/\d{2}(?:\s+\d{2}:\d{2})?)/i);
      if (match) return match[2];
      
      match = bodyText.match(/ETA[^0-9]*(\d{4}\/\d{2}\/\d{2}(?:\s+\d{2}:\d{2})?)/i);
      if (match) return match[1];
      
      match = bodyText.match(/(\d{4}\/\d{2}\/\d{2})/);
      if (match) return match[1];
      
      return null;
    });

    console.log("🎯 Extraction Result:");
    console.log("─".repeat(60));
    if (eta) {
      console.log(`✅ ETA Found: ${eta}`);
      
      // Test date formatting
      const formatted = eta.split(" ")[0].replace(/\//g, "-");
      console.log(`📅 After formatting: ${formatted}`);
      
      if (/^\d{4}-\d{2}-\d{2}$/.test(formatted)) {
        console.log(`✅ Format valid for database storage`);
      }
    } else {
      console.log(`❌ ETA Not Found`);
      console.log(`\n💡 Possible reasons:`);
      console.log(`   1. Container number not found in system`);
      console.log(`   2. JavaScript didn't execute properly`);
      console.log(`   3. Page blocked by anti-bot protection`);
      console.log(`   4. HTML structure changed`);
    }
    console.log("─".repeat(60) + "\n");

    await browser.close();
    console.log("✅ Browser closed\n");

    // Summary
    console.log("╔════════════════════════════════════════════════════════════╗");
    console.log("║     📋 Diagnostic Summary                                  ║");
    console.log("╚════════════════════════════════════════════════════════════╝\n");

    if (eta) {
      console.log("✅ SCRAPER IS WORKING CORRECTLY\n");
      console.log(`   Raw ETA: ${eta}`);
      console.log(`   Formatted: ${eta.split(" ")[0].replace(/\//g, "-")}`);
      console.log(`   Status: Should appear in database\n`);
      console.log("💡 If ETA still not visible in table, check:");
      console.log("   1. Database update query (might be filtered by status)");
      console.log("   2. UI table component (might filter null values)");
      console.log("   3. Database connection and queries\n");
    } else {
      console.log("❌ SCRAPER CANNOT FIND ETA\n");
      console.log("🔧 Troubleshooting steps:");
      console.log("   1. Test with different container number (if available)");
      console.log("   2. Check if YangMing page URL is still correct");
      console.log("   3. Verify container is actually in YangMing system");
      console.log("   4. Check browser console for JavaScript errors\n");
    }

  } catch (error) {
    console.error("❌ Error during diagnostic:", error);
    process.exit(1);
  }
}

runDiagnostic().catch(console.error);
