def generate_weekly_report(client, brand_id: str) -> dict:
windows = complete_seven_day_windows()
current = client.get_performance(
brand_id,
start_date=windows['current']['start_date'],
end_date=windows['current']['end_date'],
)
previous = client.get_performance(
brand_id,
start_date=windows['previous']['start_date'],
end_date=windows['previous']['end_date'],
)
metric_keys = [
('Mention Rate', 'mentionRate'),
('Source Rate', 'sourceRate'),
('Coverage', 'coverage'),
('Share of Voice', 'shareOfVoice'),
('Sentiment', 'sentiment'),
]
metrics = []
for name, key in metric_keys:
change_points = round(
current['scores'][key] - previous['scores'][key], 2
)
direction = (
'increased' if change_points > 0
else 'decreased' if change_points < 0
else 'unchanged'
)
metrics.append({
'name': name,
'current': current['scores'][key],
'previous': previous['scores'][key],
'change_points': change_points,
'direction': direction,
})
return {
'generated_at': datetime.now(timezone.utc).isoformat(),
'windows': windows,
'metrics': metrics,
'methodology': {
'current': current['methodology'],
'previous': previous['methodology'],
},
}