import 'package:shared_preferences/shared_preferences.dart';
class LearningProgressService {
static final Set<String> _memoryCompleted = <String>{};
static int _memoryStreak = 0;
static const _completedKey = 'mw_learning_completed_units';
static const _lastLearningKey = 'mw_learning_last_date';
static const _streakKey = 'mw_learning_streak';
Future<Set<String>> completedUnits() async {
try {
final prefs = await SharedPreferences.getInstance();
final values =
(prefs.getStringList(_completedKey) ?? const <String>[]).toSet();
_memoryCompleted
..clear()
..addAll(values);
return values;
} catch (_) {
return Set<String>.from(_memoryCompleted);
}
}
Future<void> complete(String unitId) async {
final done = await completedUnits();
done.add(unitId);
_memoryCompleted
..clear()
..addAll(done);
final today = _day(DateTime.now());
try {
final prefs = await SharedPreferences.getInstance();
final lastRaw = prefs.getString(_lastLearningKey);
final last = lastRaw == null ? null : DateTime.tryParse(lastRaw);
var streak = prefs.getInt(_streakKey) ?? _memoryStreak;
if (last == null) {
streak = 1;
} else {
final diff = today.difference(_day(last)).inDays;
if (diff == 1) streak += 1;
if (diff > 1) streak = 1;
}
_memoryStreak = streak;
try {
await prefs.setStringList(_completedKey, done.toList()..sort());
} catch (_) {}
try {
await prefs.setInt(_streakKey, streak);
} catch (_) {}
try {
await prefs.setString(_lastLearningKey, today.toIso8601String());
} catch (_) {}
} catch (_) {
if (_memoryStreak == 0) _memoryStreak = 1;
}
}
Future<int> streak() async {
try {
final value =
(await SharedPreferences.getInstance()).getInt(_streakKey) ??
_memoryStreak;
_memoryStreak = value;
return value;
} catch (_) {
return _memoryStreak;
}
}
DateTime _day(DateTime d) => DateTime(d.year, d.month, d.day);
}

