import axios from "axios";

/**
 * Simple test script to verify Maersk ETA scraping for container MNBU4288732
 * Run with: npx tsx scripts/test-maersk-container.ts
 * 
 * No database dependency - just tests web scraping
 */

const axiosClient = axios.create({
  timeout: 15000,
  headers: {
    "User-Agent":
      "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36",
    Accept: "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
    "Accept-Language": "en-US,en-q=0.5",
    "Accept-Encoding": "gzip, deflate",
    DNT: "1",
    Connection: "keep-alive",
    "Upgrade-Insecure-Requests": "1",
  },
});

async function scrapMaerskTest(trackingUrl: string): Promise<{ raw: string; dates: string[] }> {
  try {
    console.log(`\n📡 Fetching: ${trackingUrl}`);
    const response = await axiosClient.get(trackingUrl);
    
    console.log(`✅ Page loaded (${response.data.length} bytes)\n`);
    
    // Find all dates in DD MMM YYYY format
    const dateRegex = /(\d{1,2})\s+(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)[a-z]*\s+(\d{4})/gi;
    const matches = [...response.data.matchAll(dateRegex)];
    const allDates = matches.map(m => `${m[1]} ${m[2]} ${m[3]}`);
    
    // Find last Vessel arrival
    const vesselRegex = /Vessel arrival[^<]*?(\d{1,2})\s+(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)[a-z]*\s+(\d{4})/i;
    const vesselMatch = response.data.match(vesselRegex);
    let lastVesselArrival = "";
    
    if (vesselMatch) {
      lastVesselArrival = `${vesselMatch[1]} ${vesselMatch[2]} ${vesselMatch[3]}`;
    }

    const resultDate = lastVesselArrival || (allDates.length > 0 ? allDates[allDates.length - 1] : "");

    return {
      raw: resultDate,
      dates: allDates,
    };
  } catch (error) {
    console.error(`❌ Error: ${error}`);
    return { raw: "Error", dates: [] };
  }
}

function formatETAForMaersk(etaString: string): string | null {
  if (
    !etaString ||
    etaString.toLowerCase().includes("no encontrado") ||
    etaString.toLowerCase().includes("error")
  ) {
    return null;
  }

  try {
    const match = etaString.match(/(\d{1,2})\s+(\w{3})\s+(\d{4})/i);
    if (match) {
      const monthMap: { [key: string]: string } = {
        jan: "01",
        feb: "02",
        mar: "03",
        apr: "04",
        may: "05",
        jun: "06",
        jul: "07",
        aug: "08",
        sep: "09",
        oct: "10",
        nov: "11",
        dec: "12",
      };
      const monthNum = monthMap[match[2].toLowerCase()];
      if (monthNum) {
        const day = match[1].padStart(2, "0");
        return `${match[3]}-${monthNum}-${day}`;
      }
    }
  } catch (error) {
    console.error(`Error formatting ETA: ${error}`);
  }

  return null;
}

async function main() {
  const containerNumber = "MNBU4288732";
  const trackingUrl = `https://www.maersk.com/tracking/${containerNumber}`;

  console.log("╔═══════════════════════════════════════════════════╗");
  console.log("║       Maersk Container ETA Scraper Test          ║");
  console.log("╚═══════════════════════════════════════════════════╝");
  console.log(`\nContainer: ${containerNumber}`);
  console.log(`Expected (on website): 31 May 2026`);
  console.log(`Current in DB: 26 Apr 2026`);

  // Test web scraping
  console.log("\n\n--- STEP 1: Web Scraping ---");
  const scrapeResult = await scrapMaerskTest(trackingUrl);
  
  console.log("Found dates on page:");
  if (scrapeResult.dates.length > 0) {
    scrapeResult.dates.slice(0, 10).forEach((date, idx) => {
      console.log(`  ${idx + 1}. ${date}`);
    });
    if (scrapeResult.dates.length > 10) {
      console.log(`  ... (${scrapeResult.dates.length - 10} more dates)`);
    }
  } else {
    console.log("  ❌ No dates found");
  }

  console.log(`\nExtracted ETA: "${scrapeResult.raw}"`);
  const formatted = formatETAForMaersk(scrapeResult.raw);
  console.log(`Formatted: "${formatted}"`);

  if (formatted === "2026-05-31") {
    console.log("\n✅ Extraction WORKING - Should update DB to 2026-05-31");
  } else if (formatted) {
    console.log(`\n⚠️ Extraction FAILED - Expected 2026-05-31, got ${formatted}`);
  } else {
    console.log(`\n❌ Extraction FAILED - Could not format date`);
  }

  console.log("\n\n--- RECOMMENDATIONS ---");
  if (formatted === "2026-05-31") {
    console.log("✅ Scraper is working correctly");
    console.log("   → Trigger scraper manually:");
    console.log("   curl -X POST http://localhost:3000/api/admin/eta-scraper \\");
    console.log('     -H "Authorization: Bearer your-secret" \\');
    console.log('     -H "Content-Type: application/json" \\');
    console.log('     -d \'{"allContainers": true, "force": true}\'');
  } else {
    console.log("⚠️ Could not extract date from website");
    console.log("   → Please paste the HTML response or screenshot");
    console.log("   → Check if Maersk changed their website structure");
  }

  process.exit(0);
}

main().catch(error => {
  console.error("Fatal error:", error);
  process.exit(1);
});
