import pool from "@/lib/db-script";
import { scrapeShippingETA, updateETAInDatabase } from "@/lib/shipping-scraper";

/**
 * Test script for Hapag Lloyd carrier scraping
 * Run with: npx tsx scripts/test-hapag-lloyd-scraper.ts
 */

// Function to detect carrier from URL
function detectCarrierFromUrl(url: string): string {
  if (!url) return "Unknown";
  if (url.includes("hapag-lloyd")) return "Hapag-Lloyd";
  if (url.includes("maersk")) return "Maersk";
  if (url.includes("cma-cgm")) return "CMA";
  if (url.includes("msc.com")) return "MSC";
  if (url.includes("hmm21.com")) return "HMM";
  if (url.includes("coscoshipping")) return "COSCO";
  if (url.includes("zim.com")) return "ZIM";
  if (url.includes("yangming")) return "YangMing";
  if (url.includes("evergreen")) return "Evergreen";
  if (url.includes("one.com")) return "ONE";
  return "Unknown";
}

async function main() {
  try {
    // Your container number and tracking URL
    const containerNumberHapag = "HLBU 6221765"; // WITH SPACE as in database
    const trackingUrlHapag =
      "https://www.hapag-lloyd.com/en/online-business/track/track-by-container-solution.html?container=HLBU++6221765";

    console.log("=== Testing Hapag Lloyd Carrier Scraping with Database Update ===\n");
    console.log(`Container: ${containerNumberHapag}`);
    console.log(`Tracking URL: ${trackingUrlHapag}\n`);

    // Step 1: Check if container exists in database
    console.log("📊 Step 1: Checking if Hapag Lloyd container exists in database...");
    const containerCheck = await pool.query(
      `SELECT id, carrier, container_number, vessel_tracking_url, eta FROM container_shipment WHERE container_number = $1`,
      [containerNumberHapag]
    );

    if (containerCheck.rows.length === 0) {
      console.log(`❌ Container ${containerNumberHapag} not found in database!`);
      console.log("Let me try searching by normalized container number (without spaces)...\n");
      
      // Try to find any Hapag Lloyd container instead
      const hapagCheck = await pool.query(
        `SELECT id, carrier, container_number, vessel_tracking_url, eta FROM container_shipment 
         WHERE carrier ILIKE '%hapag%' OR carrier ILIKE '%hlc%' OR carrier ILIKE '%hloyd%' LIMIT 1`
      );

      if (hapagCheck.rows.length === 0) {
        console.log("❌ No Hapag Lloyd containers found in database.");
        console.log("\nTo test this scraper, you need to:");
        console.log("1. Create a container in the dashboard with:");
        console.log("   - Container Number: HLBU 6221765 (with space)");
        console.log("   - Carrier: Hapag-Lloyd");
        console.log("   - Vessel Tracking URL: https://www.hapag-lloyd.com/en/online-business/track/track-by-container-solution.html?container=HLBU++6221765");
        console.log("\n2. Then run this script again");
        await pool.end();
        process.exit(1);
      }

      const container = hapagCheck.rows[0];
      await testContainer(pool, container);
    } else {
      const container = containerCheck.rows[0];
      await testContainer(pool, container);
    }

    console.log("\n✅ ALL DONE! The ETA should now appear in the dashboard.");
    await pool.end();
    process.exit(0);
  } catch (error) {
    console.error("❌ Fatal error:", error);
    await pool.end();
    process.exit(1);
  }
}

async function testContainer(pool: any, container: any) {
  console.log(`\n✅ Container found!`);
  console.log(`   ID: ${container.id}`);
  console.log(`   Carrier: ${container.carrier || "(auto-detect from URL)"}`);
  console.log(`   Current ETA: ${container.eta}`);
  console.log(`   Tracking URL: ${container.vessel_tracking_url}\n`);

  // Detect carrier from URL if not available
  const carrierName = container.carrier || detectCarrierFromUrl(container.vessel_tracking_url) || "Hapag-Lloyd";

  // Step 2: Scrape ETA
  console.log(`📥 Step 2: Scraping ${carrierName} website...`);
  console.log("(This may take 10-15 seconds as Playwright needs to render the page)\n");
  const startTime = Date.now();

  const result = await scrapeShippingETA(
    container.container_number,
    carrierName,
    container.vessel_tracking_url
  );

  const elapsed = Date.now() - startTime;
  console.log(`✅ Scraping completed in ${elapsed}ms`);
  console.log(`   Status: ${result.status}`);
  console.log(`   Raw ETA: ${result.etaRaw}`);
  console.log(`   Formatted ETA: ${result.etaFormatted}\n`);

  // Step 3: Update database
  console.log("💾 Step 3: Updating database...");
  await updateETAInDatabase(pool, container.id, carrierName, result);
  console.log(`✅ Database updated!\n`);

  // Step 4: Verify update
  console.log("🔍 Step 4: Verifying update...");
  const verify = await pool.query(
    `SELECT container_number, eta, eta_raw FROM container_shipment WHERE id = $1`,
    [container.id]
  );

  if (verify.rows.length > 0) {
    const updated = verify.rows[0];
    console.log(`✅ Container updated successfully!`);
    console.log(`   Container Number: ${updated.container_number}`);
    console.log(`   New ETA: ${updated.eta}`);
    console.log(`   Raw: ${updated.eta_raw}\n`);
  }
}

main().catch(console.error);
