using System;
using System.Collections.Generic;
using Windows.ApplicationModel;
using Windows.Storage;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Navigation;

namespace ApplicationStateSave
{
    public class SaveStatePage : Page
    {
        protected Dictionary<string, object> pageState;

        static protected Dictionary<int, Dictionary<string, object>> pages =
                                new Dictionary<int, Dictionary<string, object>>();

        static SaveStatePage()
        {
            // Ustawienie metody obsługi zdarzenia Suspending
            Application.Current.Suspending += OnApplicationSuspending;

            ApplicationDataContainer appData = ApplicationData.Current.LocalSettings;

            // Przeglądanie kontenerów, po jednym dla każdej stony w stosie powrotu
            foreach (ApplicationDataContainer container in appData.Containers.Values)
            {
                // Tworzenie słownika stanu dla tej strony
                Dictionary<string, object> pageState = new Dictionary<string, object>();

                // Wypełnienie go wartościami
                foreach (string key in container.Values.Keys)
                {
                    pageState.Add(key, container.Values[key]);
                }

                // Zapis w statycznym słowniku
                int pageKey = Int32.Parse(container.Name);
                pages[pageKey] = pageState;
            }
        }

        static void OnApplicationSuspending(object sender, SuspendingEventArgs args)
        {
            ApplicationDataContainer appData = ApplicationData.Current.LocalSettings;

            foreach (int pageKey in pages.Keys)
            {
                // Tworzenei kontenera na podstawie lokalizacji w stosie powrotu
                string containerName = pageKey.ToString();

                // Pobranie kontenera o danej nazwie i wyczyszczenie go
                ApplicationDataContainer container =
                    appData.CreateContainer(containerName,
                                            ApplicationDataCreateDisposition.Always);
                container.Values.Clear();

                // Zapisanie ustawień dla każdej strony w kontenerze
                foreach (string key in pages[pageKey].Keys)
                    container.Values.Add(key, pages[pageKey][key]);
            }
        }

        protected override void OnNavigatedTo(NavigationEventArgs args)
        {
            if (args.NavigationMode == NavigationMode.New)
            {
                // Tworzenie klucza słownika
                int pageKey = this.Frame.BackStackDepth;

                // Usunięcie kluczy strony i wyższych kluczy
                for (int key = pageKey; pages.Remove(key); key++) ;

                // Utworzenie nowego słownika stanu strony i zapisanie go
                pageState = new Dictionary<string, object>();
                pages.Add(pageKey, pageState);
            }

            base.OnNavigatedTo(args);
        }
    }
}