import QuizResult from "../models/quizResult";
import UserCertificate from "../models/userCertificate";
import Attendance from "../models/attendance";

type ActivityType = "quiz" | "certification" | "attendance";

interface ActivityItem {
  type: ActivityType;
  message: string;
  createdAt: Date;
}

export const getRecentActivity = async (
  userId: string,
): Promise<ActivityItem[]> => {
  // Fetch all in parallel
  const [quizResults, certificates, attendance] = await Promise.all([
    // Quiz activity
    QuizResult.find({ user: userId })
      .populate("quiz", "title")
      .select("quiz submitted_at score")
      .sort({ submitted_at: -1 })
      .limit(5)
      .lean(),

    // Certificate activity (no pagination needed here)
    UserCertificate.find({ user: userId })
      .select("title createdAt")
      .sort({ createdAt: -1 })
      .limit(5)
      .lean(),

    // Today attendance (only 1 record max)
    Attendance.findOne({
      user: userId,
      date: new Date().toISOString().slice(0, 10),
    })
      .select("sessions createdAt")
      .lean(),
  ]);

  // 🧩 Normalize quiz
  const quizActivities: ActivityItem[] = quizResults
    .filter((q: any) => q.quiz)
    .map((q: any) => ({
      type: "quiz",
      message: `Completed quiz "${q.quiz.title}"`,
      createdAt: q.submitted_at,
    }));

  // 🧩 Normalize certificates
  const certActivities: ActivityItem[] = certificates.map((c: any) => ({
    type: "certification",
    message: `Earned certificate "${c.title}"`,
    createdAt: c.createdAt,
  }));

  // 🧩 Normalize attendance
  const attendanceActivities: ActivityItem[] =
    attendance?.sessions?.flatMap((session: any) => {
      const items: ActivityItem[] = [];

      if (session.check_in) {
        items.push({
          type: "attendance",
          message: "Checked in",
          createdAt: new Date(session.check_in),
        });
      }

      if (session.check_out) {
        items.push({
          type: "attendance",
          message: "Checked out",
          createdAt: new Date(session.check_out),
        });
      }

      return items;
    }) || [];

  // 🔀 Merge + sort + limit
  const allActivities = [
    ...quizActivities,
    ...certActivities,
    ...attendanceActivities,
  ]
    .sort((a, b) => b.createdAt.getTime() - a.createdAt.getTime())
    .slice(0, 5);

  return allActivities;
};
