#!/usr/bin/env npx tsx
/**
 * Run all batch scraper scripts for all carriers
 * 
 * Usage:
 *   npm run scrape:all          # Run all 8 carriers (auto + manual)
 *   npm run scrape:auto         # Run 6 automated carriers only
 *   npm run scrape:manual       # Run 2 manual carriers (CMA + Hapag)
 *   npx tsx scripts/run-all-batch-scrapers.ts [all|auto|manual]
 */

import { spawn } from "child_process";
import * as fs from "fs";
import * as path from "path";

const AUTOMATED_CARRIERS = ["maersk", "msc", "yangming", "oneu", "evergreen", "hmm"];
const MANUAL_CARRIERS = ["cma", "hapag"];
const ALL_CARRIERS = [...AUTOMATED_CARRIERS, ...MANUAL_CARRIERS];

interface RunOptions {
  type: "all" | "auto" | "manual";
  verbose?: boolean;
}

function getCarriers(type: "all" | "auto" | "manual"): string[] {
  switch (type) {
    case "auto":
      return AUTOMATED_CARRIERS;
    case "manual":
      return MANUAL_CARRIERS;
    case "all":
    default:
      return ALL_CARRIERS;
  }
}

async function runCarrier(carrier: string): Promise<{ carrier: string; success: boolean; error?: string }> {
  return new Promise((resolve) => {
    const scriptPath = path.join(__dirname, `batch-update-${carrier}.ts`);
    
    if (!fs.existsSync(scriptPath)) {
      resolve({ carrier, success: false, error: `Script not found: ${scriptPath}` });
      return;
    }

    console.log(`\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━`);
    console.log(`🌐 Running: ${carrier.toUpperCase()}`);
    console.log(`━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━`);

    const child = spawn("npx", ["tsx", scriptPath], {
      stdio: "inherit",
      env: { ...process.env },
    });

    child.on("error", (err) => {
      resolve({ carrier, success: false, error: err.message });
    });

    child.on("exit", (code) => {
      const success = code === 0;
      if (!success) {
        console.log(`\n❌ ${carrier.toUpperCase()} exited with code ${code}`);
      }
      resolve({ carrier, success });
    });
  });
}

async function main() {
  const arg = process.argv[2] || "all";
  const validTypes = ["all", "auto", "manual"];

  if (!validTypes.includes(arg)) {
    console.error(`❌ Invalid type: ${arg}`);
    console.error(`Valid types: ${validTypes.join(", ")}`);
    process.exit(1);
  }

  const type = arg as "all" | "auto" | "manual";
  const carriers = getCarriers(type);

  console.log(`\n╔════════════════════════════════════════════╗`);
  console.log(`║  🚀 BATCH SCRAPER RUNNER (${type.toUpperCase()})           ║`);
  console.log(`╚════════════════════════════════════════════╝`);
  console.log(`\n📋 Carriers to scrape (${carriers.length}):`);
  carriers.forEach((c, i) => {
    const isManual = MANUAL_CARRIERS.includes(c) ? " [MANUAL]" : " [AUTO]";
    console.log(`   ${i + 1}. ${c.toUpperCase()}${isManual}`);
  });

  console.log(`\n⏱️  Start time: ${new Date().toISOString()}`);
  const startTime = Date.now();

  // Run all carriers sequentially
  const results = [];
  for (const carrier of carriers) {
    const result = await runCarrier(carrier);
    results.push(result);
  }

  // Summary
  const duration = ((Date.now() - startTime) / 1000).toFixed(2);
  const successful = results.filter((r) => r.success).length;
  const failed = results.filter((r) => !r.success).length;

  console.log(`\n\n╔════════════════════════════════════════════╗`);
  console.log(`║  📊 EXECUTION SUMMARY                      ║`);
  console.log(`╚════════════════════════════════════════════╝`);
  console.log(`\n⏱️  Duration: ${duration}s`);
  console.log(`✅ Successful: ${successful}/${carriers.length}`);
  console.log(`❌ Failed: ${failed}/${carriers.length}`);

  if (failed > 0) {
    console.log(`\n⚠️  Failed carriers:`);
    results.filter((r) => !r.success).forEach((r) => {
      console.log(`   - ${r.carrier.toUpperCase()}: ${r.error || "Unknown error"}`);
    });
  }

  console.log(`\n✅ Completed at: ${new Date().toISOString()}\n`);

  // Exit with error if any carrier failed
  process.exit(failed > 0 ? 1 : 0);
}

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