async function generateWeeklyReport(client, brandId) {
const now = new Date();
// Calculate date ranges
const thisWeekEnd = now.toISOString().split('T')[0];
const thisWeekStart = new Date(now - 7 * 24 * 60 * 60 * 1000).toISOString().split('T')[0];
const lastWeekEnd = thisWeekStart;
const lastWeekStart = new Date(now - 14 * 24 * 60 * 60 * 1000).toISOString().split('T')[0];
// Fetch both periods in parallel
const [thisWeek, lastWeek] = await Promise.all([
client.getPerformance(brandId, { startDate: thisWeekStart, endDate: thisWeekEnd }),
client.getPerformance(brandId, { startDate: lastWeekStart, endDate: lastWeekEnd }),
]);
const calculateChange = (current, previous) => {
if (!previous || previous === 0) return null;
return ((current - previous) / previous * 100).toFixed(1);
};
const getTrend = (current, previous) => {
if (current > previous) return 'up';
if (current < previous) return 'down';
return 'stable';
};
const metrics = [
{ name: 'GEO Score', key: 'global' },
{ name: 'Mention Rate', key: 'mentionRate' },
{ name: 'Source Rate', key: 'sourceRate' },
{ name: 'Share of Voice', key: 'shareOfVoice' },
{ name: 'Sentiment', key: 'sentiment' },
];
return {
generatedAt: new Date().toISOString(),
period: {
thisWeek: { start: thisWeekStart, end: thisWeekEnd },
lastWeek: { start: lastWeekStart, end: lastWeekEnd },
},
metrics: metrics.map(m => ({
name: m.name,
current: thisWeek.scores[m.key],
previous: lastWeek.scores[m.key],
change: calculateChange(thisWeek.scores[m.key], lastWeek.scores[m.key]),
trend: getTrend(thisWeek.scores[m.key], lastWeek.scores[m.key]),
})),
methodology: {
thisWeek: thisWeek.methodology.responsesTotal,
lastWeek: lastWeek.methodology.responsesTotal,
},
};
}