import { getDb } from "./mongodb";
import { QuizUser, QuizAttempt } from "@/types/quiz";

// --- Quiz Users ---

export async function getOrCreateQuizUser(name: string, email: string): Promise<QuizUser> {
  const db = await getDb();
  const col = db.collection("quizUsers");
  const normalizedEmail = email.trim().toLowerCase();

  const existing = await col.findOne({ email: normalizedEmail });
  if (existing) {
    await col.updateOne(
      { email: normalizedEmail },
      { $set: { name: name.trim(), lastSeenAt: new Date().toISOString() } }
    );
    return { ...existing, name: name.trim(), lastSeenAt: new Date().toISOString() } as unknown as QuizUser;
  }

  const newUser: QuizUser = {
    id: `u-${Date.now()}-${Math.random().toString(36).substring(2, 7)}`,
    name: name.trim(),
    email: normalizedEmail,
    createdAt: new Date().toISOString(),
    lastSeenAt: new Date().toISOString(),
  };
  await col.insertOne({ ...newUser });
  return newUser;
}

export async function getAllQuizUsers(): Promise<QuizUser[]> {
  const db = await getDb();
  return db.collection("quizUsers").find().toArray() as unknown as QuizUser[];
}

// --- Quiz Attempts ---

export async function createAttempt(attempt: QuizAttempt): Promise<void> {
  const db = await getDb();
  await db.collection("attempts").insertOne({ ...attempt });
}

export async function updateAttempt(attempt: QuizAttempt): Promise<void> {
  const db = await getDb();
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
  const { _id, ...doc } = attempt as QuizAttempt & { _id?: unknown };
  await db.collection("attempts").updateOne(
    { id: attempt.id },
    { $set: doc }
  );
}

export async function getAttempt(id: string): Promise<QuizAttempt | null> {
  const db = await getDb();
  return db.collection("attempts").findOne({ id }) as unknown as QuizAttempt | null;
}

export async function getAttemptsByUserId(userId: string): Promise<QuizAttempt[]> {
  const db = await getDb();
  return db.collection("attempts")
    .find({ userId })
    .sort({ startedAt: -1 })
    .toArray() as unknown as QuizAttempt[];
}

export async function getAllAttempts(): Promise<QuizAttempt[]> {
  const db = await getDb();
  return db.collection("attempts")
    .find()
    .sort({ startedAt: -1 })
    .toArray() as unknown as QuizAttempt[];
}
