using System.Collections.ObjectModel; using System.Linq; using Newtonsoft.Json; using Microsoft.Maui.Controls; using Microsoft.Maui.Storage; using galacticlip_app.Models; using System.Windows.Input; namespace galacticlip_app.ViewModels { public class BookmarkViewModel : BindableObject { private ObservableCollection _bookmarkedItems; private string _searchQuery; public ICommand OpenMediaDetailCommand { get; } public ObservableCollection BookmarkedItems { get => _bookmarkedItems; set { _bookmarkedItems = value; OnPropertyChanged(); } } public string SearchQuery { get => _searchQuery; set { _searchQuery = value; OnPropertyChanged(); FilterBookmarks(); // Automatically filter as user types } } public Command RemoveBookmarkCommand { get; } public BookmarkViewModel() { BookmarkedItems = LoadBookmarks(); RemoveBookmarkCommand = new Command(RemoveBookmark); // Listen for "ClearBookmarks" message AppMessenger.MessageReceived += HandleMessage; OpenMediaDetailCommand = new Command(OnOpenMediaDetail); } private void HandleMessage(string message) { if (message == "ClearBookmarks") { // Clear the bookmarks collection and save changes BookmarkedItems.Clear(); SaveBookmarks(); } } // Ensure you unsubscribe to avoid memory leaks ~BookmarkViewModel() { AppMessenger.MessageReceived -= HandleMessage; } public ObservableCollection LoadBookmarks() { // Retrieve bookmarks from preferences var json = Preferences.Get("BookmarkedItems", string.Empty); if (string.IsNullOrWhiteSpace(json)) return new ObservableCollection(); var bookmarks = JsonConvert.DeserializeObject>(json); return new ObservableCollection(bookmarks ?? new List()); } private void SaveBookmarks() { // Save the current list of bookmarks to preferences var json = JsonConvert.SerializeObject(BookmarkedItems.ToList()); Preferences.Set("BookmarkedItems", json); // Notify other parts of the app NotifyBookmarksChanged(); } private void NotifyBookmarksChanged() { AppMessenger.SendMessage("BookmarksUpdated"); } private void RemoveBookmark(NasaMediaItem item) { // Remove the item and save the updated list BookmarkedItems.Remove(item); SaveBookmarks(); } private void FilterBookmarks() { if (string.IsNullOrWhiteSpace(SearchQuery)) { // Reload full list if query is empty BookmarkedItems = LoadBookmarks(); return; } // Filter items based on the search query var filtered = BookmarkedItems .Where(item => item.Title.Contains(SearchQuery, StringComparison.OrdinalIgnoreCase) || item.Description.Contains(SearchQuery, StringComparison.OrdinalIgnoreCase)) .ToList(); BookmarkedItems = new ObservableCollection(filtered); } private async void OnOpenMediaDetail(NasaMediaItem item) { if (item != null) { await App.Current.MainPage.Navigation.PushModalAsync(new MediaDetailPage(item)); } } } }