/**
 * Import questions from data/imported/<competition>/supported.json into MongoDB templates.
 *
 * Usage:
 *   npx tsx scripts/import-questions.ts
 *   npx tsx scripts/import-questions.ts --dry-run
 *   npx tsx scripts/import-questions.ts --overwrite
 */

import { MongoClient } from "mongodb";
import { readFileSync, readdirSync, existsSync } from "fs";
import path from "path";

const MONGO_URL =
  process.env.MONGO_URL_LOCAL ||
  "mongodb://root:M0nGRo0t@62.171.144.4:27031/classmaker?authSource=admin";

const IMPORTED_DIR = path.join(process.cwd(), "data", "imported");

const DRY_RUN = process.argv.includes("--dry-run");
const OVERWRITE = process.argv.includes("--overwrite");

interface QuizTemplate {
  id: string;
  title: string;
  description: string;
  questions: unknown[];
}

async function importQuestions() {
  if (!existsSync(IMPORTED_DIR)) {
    console.error(`Directory not found: ${IMPORTED_DIR}`);
    process.exit(1);
  }

  const subdirs = readdirSync(IMPORTED_DIR, { withFileTypes: true })
    .filter((d) => d.isDirectory())
    .map((d) => d.name)
    .sort();

  if (subdirs.length === 0) {
    console.log("No subdirectories found in data/imported/");
    return;
  }

  const templates: QuizTemplate[] = [];
  const skippedFiles: string[] = [];

  for (const dir of subdirs) {
    const supportedFile = path.join(IMPORTED_DIR, dir, "supported.json");
    if (!existsSync(supportedFile)) {
      skippedFiles.push(`${dir}/supported.json (not found)`);
      continue;
    }

    let template: QuizTemplate;
    try {
      template = JSON.parse(readFileSync(supportedFile, "utf-8")) as QuizTemplate;
    } catch (err) {
      skippedFiles.push(`${dir}/supported.json (parse error: ${err})`);
      continue;
    }

    if (!template.id || !template.title || !Array.isArray(template.questions)) {
      skippedFiles.push(`${dir}/supported.json (invalid shape – missing id/title/questions)`);
      continue;
    }

    if (template.questions.length === 0) {
      skippedFiles.push(`${dir}/supported.json (0 questions)`);
      continue;
    }

    templates.push(template);
  }

  console.log(`\nFound ${templates.length} template(s) to import:`);
  for (const t of templates) {
    console.log(`  - ${t.id} (${t.questions.length} questions): ${t.title}`);
  }

  if (skippedFiles.length > 0) {
    console.log(`\nSkipped ${skippedFiles.length} file(s):`);
    for (const f of skippedFiles) {
      console.log(`  - ${f}`);
    }
  }

  if (DRY_RUN) {
    console.log("\n[DRY RUN] No changes written to MongoDB.");
    return;
  }

  const client = new MongoClient(MONGO_URL);
  await client.connect();
  const db = client.db();
  const col = db.collection("templates");

  let inserted = 0;
  let updated = 0;
  let skipped = 0;

  for (const template of templates) {
    const existing = await col.findOne({ id: template.id });

    if (existing && !OVERWRITE) {
      console.log(`  SKIP  ${template.id} (already exists; use --overwrite to replace)`);
      skipped++;
      continue;
    }

    // eslint-disable-next-line @typescript-eslint/no-unused-vars
    const { _id, ...doc } = template as QuizTemplate & { _id?: unknown };

    if (existing) {
      await col.updateOne({ id: template.id }, { $set: doc });
      console.log(`  UPDATE ${template.id}`);
      updated++;
    } else {
      await col.insertOne({ ...doc });
      console.log(`  INSERT ${template.id}`);
      inserted++;
    }
  }

  await client.close();

  console.log(`\nDone. Inserted: ${inserted}, Updated: ${updated}, Skipped: ${skipped}`);
}

importQuestions().catch((err) => {
  console.error("Import failed:", err);
  process.exit(1);
});
