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

// Load env from .env file FIRST, before any other imports
dotenv.config({ path: path.resolve(process.cwd(), ".env") });

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

/**
 * Test script for HMM carrier scraping
 * Run with: npx tsx scripts/test-hmm-scraper.ts
 */

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 containerNumberHMM = "HDMU5599362";
    const trackingUrlHMM =
      "https://www.hmm21.com/e-service/general/trackNTrace/TrackNTrace.do";

    console.log("=== Testing HMM Carrier Scraping with Database Update ===\n");
    console.log(`Container: ${containerNumberHMM}`);
    console.log(`Tracking URL: ${trackingUrlHMM}\n`);

    // Step 1: Check if container exists in database
    console.log("📊 Step 1: Checking if HMM 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`,
      [containerNumberHMM]
    );

    if (containerCheck.rows.length === 0) {
      console.log(`❌ Container ${containerNumberHMM} not found in database!`);
      console.log("Let me try searching by HMM carrier...\n");
      
      // Try to find any HMM container instead
      const hmmCheck = await pool.query(
        `SELECT id, carrier, container_number, vessel_tracking_url, eta FROM container_shipment 
         WHERE carrier ILIKE '%hmm%' OR carrier ILIKE '%hyundai%' LIMIT 1`
      );

      if (hmmCheck.rows.length === 0) {
        console.log("❌ No HMM 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: HDMU5599362");
        console.log("   - Carrier: HMM");
        console.log("   - Vessel Tracking URL: https://www.hmm21.com/e-service/general/trackNTrace/TrackNTrace.do");
        console.log("\n2. Then run this script again");
        await pool.end();
        process.exit(1);
      }

      const container = hmmCheck.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 || "HMM";

  // Step 2: Scrape ETA
  console.log(`📥 Step 2: Scraping ${carrierName} website...`);
  console.log("(This may take 20-30 seconds as Playwright needs to render and submit the form)\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 id, 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: ${updated.container_number}`);
    console.log(`   New ETA: ${updated.eta}`);
    console.log(`   Raw ETA: ${updated.eta_raw}\n`);
  } else {
    console.log("❌ Container not found after update!\n");
  }
}

main();
