// Represents a collection of landmarks that represent a journey
// Different instances of a Trip can be saved and loaded by the user

import 'dart:collection';
import 'dart:convert';

import 'package:anyway/structs/landmark.dart';
import 'package:shared_preferences/shared_preferences.dart';

class Trip {
  final String uuid;
  final String cityName;
  // TODO: cityName should be inferred from coordinates of the Landmarks
  final LinkedList<Landmark> landmarks;
  // could be empty as well


  Trip({
    required this.uuid,
    required this.cityName,
    required this.landmarks,
  });


  factory Trip.fromJson(Map<String, dynamic> json) {
    return Trip(
      uuid: json['uuid'],
      cityName: json['city_name'],
      landmarks: LinkedList()
    );
  }


  factory Trip.fromPrefs(SharedPreferences prefs, String uuid) {
    String? content = prefs.getString('trip_$uuid');
    Map<String, dynamic> json = jsonDecode(content!);
    Trip trip = Trip.fromJson(json);
    String? firstUUID = json['entry_uuid'];
    readLandmarks(trip.landmarks, prefs, firstUUID);
    return trip;
  }


  Map<String, dynamic> toJson() => {
    'uuid': uuid,
    'city_name': cityName,
    'entry_uuid': landmarks.first?.uuid ?? ''
  };


  void toPrefs(SharedPreferences prefs){
    Map<String, dynamic> json = toJson();
    prefs.setString('trip_$uuid', jsonEncode(json));
    for (Landmark landmark in landmarks) {
      landmarkToPrefs(prefs, landmark, landmark.next);
    }
  }
}


// Helper
readLandmarks(LinkedList<Landmark> landmarks, SharedPreferences prefs, String? firstUUID) {
  while (firstUUID != null) {
    var (head, nextUUID) = getLandmarkFromPrefs(prefs, firstUUID);
    landmarks.add(head);
    firstUUID = nextUUID;
  }
}



void removeAllTripsFromPrefs () async {
  SharedPreferences prefs = await SharedPreferences.getInstance();
  prefs.clear();
}