import 'package:hl_lieferservice/feature/delivery/model/delivery_phase.dart';
import 'package:shared_preferences/shared_preferences.dart';

/// Persistiert die aktuelle Phase pro Fahrzeug. Der Key ist datumsspezifisch,
/// damit ein App-Neustart am nächsten Tag automatisch wieder mit Phase 1
/// (Sortieren) startet — die Phase eines Vortags hat keine Bedeutung mehr.
///
/// Zusätzlich wird die **höchste am Tag erreichte Phase** pro Fahrzeug
/// persistiert (eigener Key-Suffix `_max`). Der Stepper nutzt diesen Wert,
/// um Vorwärts-Sprünge auf bereits besuchte Phasen zu erlauben — auch wenn
/// der Fahrer zwischenzeitlich zurückgesprungen ist.
class PhaseService {
  static const _prefix = "delivery_phase";

  String _key(String carId) {
    final now = DateTime.now();
    final date = "${now.year}_${now.month}_${now.day}";
    return "${_prefix}_${date}_$carId";
  }

  String _maxKey(String carId) {
    final now = DateTime.now();
    final date = "${now.year}_${now.month}_${now.day}";
    return "${_prefix}_max_${date}_$carId";
  }

  Future<void> save(String carId, DeliveryPhase phase) async {
    final prefs = await SharedPreferences.getInstance();
    await prefs.setString(_key(carId), phase.persistenceKey);
  }

  Future<DeliveryPhase?> load(String carId) async {
    final prefs = await SharedPreferences.getInstance();
    return DeliveryPhaseExtension.fromPersistenceKey(prefs.getString(_key(carId)));
  }

  Future<void> saveMax(String carId, DeliveryPhase phase) async {
    final prefs = await SharedPreferences.getInstance();
    await prefs.setString(_maxKey(carId), phase.persistenceKey);
  }

  Future<DeliveryPhase?> loadMax(String carId) async {
    final prefs = await SharedPreferences.getInstance();
    return DeliveryPhaseExtension.fromPersistenceKey(
      prefs.getString(_maxKey(carId)),
    );
  }

  Future<Map<String, DeliveryPhase>> loadAll(Iterable<String> carIds) async {
    final result = <String, DeliveryPhase>{};
    for (final carId in carIds) {
      final phase = await load(carId);
      if (phase != null) result[carId] = phase;
    }
    return result;
  }
}
