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 DATA_DIR = path.join(process.cwd(), "data");

async function seed() {
  const client = new MongoClient(MONGO_URL);
  await client.connect();
  const db = client.db();

  console.log("Connected to MongoDB");

  // --- Users (auth) ---
  const usersFile = path.join(DATA_DIR, "users.json");
  if (existsSync(usersFile)) {
    const users = JSON.parse(readFileSync(usersFile, "utf-8"));
    if (users.length > 0) {
      await db.collection("users").deleteMany({});
      await db.collection("users").insertMany(users);
      console.log(`Seeded ${users.length} auth users`);
    }
  }

  // --- Quiz Users ---
  const quizUsersFile = path.join(DATA_DIR, "quiz-users.json");
  if (existsSync(quizUsersFile)) {
    const quizUsers = JSON.parse(readFileSync(quizUsersFile, "utf-8"));
    if (quizUsers.length > 0) {
      await db.collection("quizUsers").deleteMany({});
      await db.collection("quizUsers").insertMany(quizUsers);
      console.log(`Seeded ${quizUsers.length} quiz users`);
    }
  }

  // --- Settings ---
  const settingsFile = path.join(DATA_DIR, "settings.json");
  if (existsSync(settingsFile)) {
    const settings = JSON.parse(readFileSync(settingsFile, "utf-8"));
    await db.collection("settings").updateOne(
      { _key: "app" },
      { $set: { ...settings, _key: "app" } },
      { upsert: true }
    );
    console.log("Seeded settings");
  }

  // --- Templates ---
  const templateFiles = readdirSync(DATA_DIR).filter(
    (f) => f.startsWith("template-") && f.endsWith(".json")
  );
  if (templateFiles.length > 0) {
    await db.collection("templates").deleteMany({});
    for (const file of templateFiles) {
      const template = JSON.parse(readFileSync(path.join(DATA_DIR, file), "utf-8"));
      await db.collection("templates").insertOne(template);
    }
    console.log(`Seeded ${templateFiles.length} templates`);
  }

  // --- Attempts ---
  const attemptsDir = path.join(DATA_DIR, "attempts");
  if (existsSync(attemptsDir)) {
    const attemptFiles = readdirSync(attemptsDir).filter(
      (f) => f.startsWith("attempt-") && f.endsWith(".json")
    );
    if (attemptFiles.length > 0) {
      await db.collection("attempts").deleteMany({});
      for (const file of attemptFiles) {
        const attempt = JSON.parse(readFileSync(path.join(attemptsDir, file), "utf-8"));
        await db.collection("attempts").insertOne(attempt);
      }
      console.log(`Seeded ${attemptFiles.length} attempts`);
    }
  }

  // --- Create indexes ---
  await db.collection("templates").createIndex({ id: 1 }, { unique: true });
  await db.collection("users").createIndex({ username: 1 }, { unique: true });
  await db.collection("quizUsers").createIndex({ email: 1 }, { unique: true });
  await db.collection("attempts").createIndex({ id: 1 }, { unique: true });
  await db.collection("attempts").createIndex({ userId: 1 });
  await db.collection("settings").createIndex({ _key: 1 }, { unique: true });
  console.log("Created indexes");

  await client.close();
  console.log("Done!");
}

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