// routes/reports.js const express = require('express'); require('dotenv').config(); const router = express.Router(); const nodemailer = require('nodemailer'); const GameSession = require('../models/GameSession'); const transporter = nodemailer.createTransport({ service: 'gmail', auth: { user: process.env.EMAIL_USER, pass: process.env.EMAIL_PASS } }); router.post('/generate-report', async (req, res) => { const { username, email } = req.body; if (!username || !email) { return res.status(400).json({ success: false, message: 'Username and email are required' }); } try { // Fetch all sessions for the user const sessions = await GameSession.find({ username }).sort({ createdAt: -1 }); if (sessions.length === 0) { return res.status(404).json({ success: false, message: 'No session data found for this user' }); } // Generate report content const report = generateReportContent(username, sessions); // Email configuration const mailOptions = { from: 'shiharahimalshi@gmail.com', to: email, subject: `Game Session Report for ${username}`, html: report }; // Send email await transporter.sendMail(mailOptions); res.json({ success: true, message: 'Report sent successfully to ' + email }); } catch (err) { console.error('Report generation error:', err); res.status(500).json({ success: false, message: 'Failed to generate report', error: err.message }); } }); function generateReportContent(username, sessions) { // Calculate statistics const totalSessions = sessions.length; const totalPlayTime = sessions.reduce((sum, session) => sum + session.durationSeconds, 0); const averagePlayTime = Math.round(totalPlayTime / totalSessions); const levelsPlayed = [...new Set(sessions.map(s => s.levelNumber))].sort((a, b) => a - b); // Format play time const formatTime = (seconds) => { const hours = Math.floor(seconds / 3600); const minutes = Math.floor((seconds % 3600) / 60); const secs = seconds % 60; return `${hours}h ${minutes}m ${secs}s`; }; // Generate professional report-style HTML let html = `

Game Session Report

Player: ${username}

Generated on: ${new Date().toLocaleDateString()}

Overall Statistics

Total Sessions: ${totalSessions}
Total Play Time: ${formatTime(totalPlayTime)}
Average Session Time: ${formatTime(averagePlayTime)}
Levels Played: ${levelsPlayed.join(', ')}

Level Statistics

`; // Level-specific stats levelsPlayed.forEach(level => { const levelSessions = sessions.filter(s => s.levelNumber === level); const levelTotalTime = levelSessions.reduce((sum, s) => sum + s.durationSeconds, 0); const levelAvgTime = Math.round(levelTotalTime / levelSessions.length); html += `
Level ${level}
Sessions: ${levelSessions.length}
Total Time: ${formatTime(levelTotalTime)}
Average Time: ${formatTime(levelAvgTime)}
`; }); html += `

Detailed Session History

`; sessions.forEach(session => { const date = session.createdAt ? new Date(session.createdAt).toLocaleDateString() : 'N/A'; const performance = session.durationSeconds < averagePlayTime ? 'Above Average' : 'Average'; html += ` `; }); html += `
Date Level Duration Performance
${date} Level ${session.levelNumber} ${formatTime(session.durationSeconds)} ${performance}
`; return html; } module.exports = router;