import mongoose from 'mongoose';
import User from '../models/users';
import QuizResult from '../models/quizResult';
import RewardRedemption from '../models/rewardRedemption';
import dbConfig from '../config/db';
import "dotenv/config";

async function migrateUserPoints() {
  await dbConfig();
  console.log('Connected to DB');

  // Aggregate quiz_points for each user
  const quizPoints = await QuizResult.aggregate([
    { $group: { _id: '$user', total: { $sum: '$score' } } }
  ]);

  // Aggregate redeemed_points for each user
  const redeemedPoints = await RewardRedemption.aggregate([
    { $match: { status: 'fulfilled' } },
    { $lookup: {
        from: 'rewardcatalogs',
        localField: 'reward',
        foreignField: '_id',
        as: 'rewardObj'
      }
    },
    { $unwind: '$rewardObj' },
    { $group: { _id: '$user', total: { $sum: '$rewardObj.points_required' } } }
  ]);

  // Map for quick lookup
  const quizPointsMap = new Map(quizPoints.map(u => [u._id.toString(), u.total]));
  const redeemedPointsMap = new Map(redeemedPoints.map(u => [u._id.toString(), u.total]));

  // Update all users
  const users = await User.find();
  for (const user of users) {
    const quiz_points = quizPointsMap.get(user._id.toString()) || 0;
    const redeemed_points = redeemedPointsMap.get(user._id.toString()) || 0;
    user.quiz_points = quiz_points;
    user.redeemed_points = redeemed_points;
    await user.save();
    console.log(`Updated user ${user._id}: quiz_points=${quiz_points}, redeemed_points=${redeemed_points}`);
  }

  console.log('Migration complete');
  mongoose.disconnect();
}

migrateUserPoints().catch(err => {
  console.error('Migration failed:', err);
  mongoose.disconnect();
});
