57 lines
2.1 KiB
Dart
57 lines
2.1 KiB
Dart
import '../database/daos/mood_dao.dart';
|
||||
|
|
|
|||
|
|
abstract class PromptBuilder {
|
|||
|
|
static String buildWeeklyPrompt(List<MoodEntryWithActivities> entries) {
|
|||
|
|
final lines = entries.map(_entryLine).join('\n');
|
|||
|
|
return '''
|
|||
|
|
You are a personal wellbeing assistant analysing a private mood journal.
|
|||
|
|
Analyse the following data and identify 2–3 patterns or correlations across mood, sleep, energy, positivity, and self-worth.
|
|||
|
|
End with one specific, actionable suggestion. Be concise (4–6 sentences total). Do not greet the user.
|
|||
|
|
|
|||
|
|
$lines''';
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
static String _entryLine(MoodEntryWithActivities e) {
|
|||
|
|
final dt = e.entry.timestamp;
|
|||
|
|
final date =
|
|||
|
|
'${dt.year}-${dt.month.toString().padLeft(2, '0')}-${dt.day.toString().padLeft(2, '0')}';
|
|||
|
|
final time =
|
|||
|
|
'${dt.hour.toString().padLeft(2, '0')}:${dt.minute.toString().padLeft(2, '0')}';
|
|||
|
|
|
|||
|
|
final parts = <String>[
|
|||
|
|
'$date $time',
|
|||
|
|
'Mood ${e.entry.moodLevel}/5',
|
|||
|
|
];
|
|||
|
|
|
|||
|
|
if (e.entry.sleepMinutes != null) {
|
|||
|
|
final h = e.entry.sleepMinutes! ~/ 60;
|
|||
|
|
final m = (e.entry.sleepMinutes! % 60).toString().padLeft(2, '0');
|
|||
|
|
parts.add('Sleep ${h}h$m');
|
|||
|
|
}
|
|||
|
|
if (e.entry.energyLevel != null) {
|
|||
|
|
parts.add('Energy ${_scale(e.entry.energyLevel!, _energyLabels)}');
|
|||
|
|
}
|
|||
|
|
if (e.entry.positivityLevel != null) {
|
|||
|
|
parts.add('Positivity ${_scale(e.entry.positivityLevel!, _positivityLabels)}');
|
|||
|
|
}
|
|||
|
|
if (e.entry.selfWorthLevel != null) {
|
|||
|
|
parts.add('Self-worth ${_scale(e.entry.selfWorthLevel!, _selfWorthLabels)}');
|
|||
|
|
}
|
|||
|
|
if (e.activities.isNotEmpty) {
|
|||
|
|
parts.add('Activities: ${e.activities.map((a) => a.name).join(', ')}');
|
|||
|
|
}
|
|||
|
|
if (e.entry.note != null && e.entry.note!.isNotEmpty) {
|
|||
|
|
parts.add('Note: ${e.entry.note}');
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return parts.join(' | ');
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
static String _scale(int level, List<String> labels) =>
|
|||
|
|
labels[(level - 1).clamp(0, labels.length - 1)];
|
|||
|
|
|
|||
|
|
static const _energyLabels = ['very low', 'low', 'ok', 'high', 'very high'];
|
|||
|
|
static const _positivityLabels = ['very negative', 'negative', 'neutral', 'positive', 'very positive'];
|
|||
|
|
static const _selfWorthLabels = ['very low', 'low', 'moderate', 'high', 'very high'];
|
|||
|
|
}
|