using OrgChartSamples.Common;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using Windows.ApplicationModel;
using Windows.ApplicationModel.Activation;
using Windows.Foundation;
using Windows.Foundation.Collections;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Controls.Primitives;
using Windows.UI.Xaml.Data;
using Windows.UI.Xaml.Input;
using Windows.UI.Xaml.Media;
using Windows.UI.Xaml.Navigation;

namespace OrgChartSamples
{
    /// <summary>
    /// Provides application-specific behavior to supplement the default Application class.
    /// </summary>
    sealed partial class App : Application
    {
        /// <summary>
        /// Initializes the singleton application object.  This is the first line of authored code
        /// executed, and as such is the logical equivalent of main() or WinMain().
        /// </summary>
        public App()
        {
            C1.UWP.LicenseManager.Key =
                "ACYBJgImB39PAHIAZwBDAGgAYQByAHQAUwBhAG0AcABsAGUAcwBJ4DgEgdG/k2Id" +
                "MWAAAXwU/wM9AIpNW0DQd1yI7ZAomhraIrZgKdt7sz1a2niC1FOPYsVNeFQcgBCJ" +
                "PCSIMSy8PYqhbLQ9X4wLLSMihUb7buPi/5H4fKKhqxFORhZukUzbNOpgKdCOQ2ec" +
                "35hTA/kmlyzBM1COCJMKRbSaA9DcVSpxndfH1UM+2HcIxZlLF+PSBH7HvfzD85ls" +
                "wJsyOvdeT/vX3juHVvHlLKvyIQW7pmB7PFFGTHkHkjHGeBqhZBei4BSexDlCCWQk" +
                "ovTl0nS9ZHdlWavH3Ru/2fruKBFLoHWVJkULWD6LQW+cVrrIwlo0f2yzwoTOQHTH" +
                "KpTjF8UStGPhisjfATqX3bv9DCcJTocK2oUFPcDx7LFt1nCQSHeTG34qhJdXYPuo" +
                "fN1weYZ+mY6LBqsUt34U7Ezxhl1KrWDcrjYzlTEKOzm4h8816jcxnh79ASpT/8Mo" +
                "FSAYAu5rZDor7R5R5YCjN9sRLqWropCSiMAUvD51IPzG54iaW8vFXLA+be6dzNlG" +
                "0fvjQJcUwGA/WDeLJ6w9GDdjH+Wn3s4k2NFyatTMFllTDJ447Z6Hba0m9FCMqVnf" +
                "rAv+nceSsDlAF0VCXfYqvEXCrlPfDqyaJlkovmRgblfw7U49U0a6CBnNyda/vBXx" +
                "iDdnMoqlE/o98tZ+hDnKWypj9Zb5BzCCBVUwggQ9oAMCAQICEEEDeNImNll6Ftsm" +
                "xr0QlIswDQYJKoZIhvcNAQEFBQAwgbQxCzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5W" +
                "ZXJpU2lnbiwgSW5jLjEfMB0GA1UECxMWVmVyaVNpZ24gVHJ1c3QgTmV0d29yazE7" +
                "MDkGA1UECxMyVGVybXMgb2YgdXNlIGF0IGh0dHBzOi8vd3d3LnZlcmlzaWduLmNv" +
                "bS9ycGEgKGMpMTAxLjAsBgNVBAMTJVZlcmlTaWduIENsYXNzIDMgQ29kZSBTaWdu" +
                "aW5nIDIwMTAgQ0EwHhcNMTQxMjExMDAwMDAwWhcNMTUxMjIyMjM1OTU5WjCBhjEL" +
                "MAkGA1UEBhMCSlAxDzANBgNVBAgTBk1peWFnaTEYMBYGA1UEBxMPU2VuZGFpIEl6" +
                "dW1pLWt1MRcwFQYDVQQKFA5HcmFwZUNpdHkgaW5jLjEaMBgGA1UECxQRVG9vbHMg" +
                "RGV2ZWxvcG1lbnQxFzAVBgNVBAMUDkdyYXBlQ2l0eSBpbmMuMIIBIjANBgkqhkiG" +
                "9w0BAQEFAAOCAQ8AMIIBCgKCAQEAwQL2ymVbspWkCpEHpVUHtcmbz5rrTHvwdlY2" +
                "a8COz96uanuluHwz0di4RVNGPwfhtpfEViriLvl7mQ2vuz6cZsnlR8zoKV2pt5Gx" +
                "DjO9Fvqel+u1w4HB9g7HTCh5hB8jpXMtXOE9saNQMrqp0dkt/8Ry9Igq9Fu7cgs4" +
                "TeS67HTuBCRv76utIFTIkpdTydbxz4r72x9aodg9vwUXYhrNbGGZ8h0igM0rKOve" +
                "v/AifeNB6Omp9qaIc2xT87bopLQRy8JLkIU4oNPq+92cCR6TeTItZ5/5xr9xsWjv" +
                "i9rBga2bDbDPD+FzCUA0hBoIDHP7kkdBndISDwstJn4LwThP7wIDAQABo4IBjTCC" +
                "AYkwCQYDVR0TBAIwADAOBgNVHQ8BAf8EBAMCB4AwKwYDVR0fBCQwIjAgoB6gHIYa" +
                "aHR0cDovL3NmLnN5bWNiLmNvbS9zZi5jcmwwZgYDVR0gBF8wXTBbBgtghkgBhvhF" +
                "AQcXAzBMMCMGCCsGAQUFBwIBFhdodHRwczovL2Quc3ltY2IuY29tL2NwczAlBggr" +
                "BgEFBQcCAjAZDBdodHRwczovL2Quc3ltY2IuY29tL3JwYTATBgNVHSUEDDAKBggr" +
                "BgEFBQcDAzBXBggrBgEFBQcBAQRLMEkwHwYIKwYBBQUHMAGGE2h0dHA6Ly9zZi5z" +
                "eW1jZC5jb20wJgYIKwYBBQUHMAKGGmh0dHA6Ly9zZi5zeW1jYi5jb20vc2YuY3J0" +
                "MB8GA1UdIwQYMBaAFM+Zqep7JvRLyY6P1/AFJu/j0qedMB0GA1UdDgQWBBQAWvCt" +
                "pdR4NfWEEqgsBQ74VhuOjjARBglghkgBhvhCAQEEBAMCBBAwFgYKKwYBBAGCNwIB" +
                "GwQIMAYBAQABAf8wDQYJKoZIhvcNAQEFBQADggEBAIjCmFo3jlvlWIqxF8IDqFtV" +
                "6oyE0ImYvriarF1i/DeCwXig4IOiIzqRaHLU2hR3Yulyv0+N8YnnllfixmWqjF5+" +
                "VOkeCdfww8m4qkMGyTtaSGIS7rl8HBv6D3BAcwx+BjSCMcgBDZkR/Y8npNNIVy+P" +
                "bjCHvd2zKpyaPb3R+nAO0doXaMTmmr+1AE4ny8OQ3jrC3ioyEbqcik6Bz0qeDIst" +
                "0Q7tXfgozU1v6w30mSpNZc2g2qU5/tCNgfCXDsq7tbeQgYr5/WQ/XGpMGlfCwETm" +
                "wuWe6M/4kCpXxoqUEkMpEjciGWsb0IlSaoU2GZnZ/lATmMC89B5d68ucxiKomuAw" +
                "ggLEMIIBrKADAgECAgQO7u7uMA0GCSqGSIb3DQEBBQUAMCQxIjAgBgNVBAMMGUdD" +
                "LVVXUCBJbnRlcm5hbCBEZXZlbG9wZXIwHhcNMTYwNTEyMTQwMTU1WhcNMTcwNTEy" +
                "MTQwMTU1WjAkMSIwIAYDVQQDDBlHQy1VV1AgSW50ZXJuYWwgRGV2ZWxvcGVyMIIB" +
                "IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAl9X38mvIrQSHa12W7TeIYtPu" +
                "mezTEKXu48gC890BCIckVIvx0DFHjly39PIMdz2fPUSACX5kHV1kOTigIUWlV8EQ" +
                "BXu23v1tq+R0WFKG13x43TufrSU/cPjeFpv9snL1MU1TmiLE157HFa1V6WC4OHfV" +
                "XaGO9BtxS3W2hT1vEXyeXSy/0vKFWwZlTaEKRCUZkYZ+DAMeKvnmLrF1348hjwM1" +
                "81jXa24JX6XNiYLHqu7U3eRPc5F8e5c2CTHu7h9lNntHMIvnKmKl1Y2BSiSn2C6h" +
                "u6hr0PoATTy0RKEgMIQdkQ3kHLUejOMCVDd5L28zO8fW3/22A/7ZurfJrNLCbwID" +
                "AQABMA0GCSqGSIb3DQEBBQUAA4IBAQBTkggFsEjldd0BYDx1bqW1tcJjGEA6gc3d" +
                "YjCvmBxSvqxCtBfiankRm5ZT6uGmZ7hMWlIK97vYXY6UFOohp9STQAyapjxAuSrO" +
                "L1df2gjikKeGsVDZrH8LrZa9416OqH5MJAMCUBT8ggDKF9/9lRSGvCJ+tisBwfJb" +
                "pSCaTWE9dUFVjMGI5duiCry/CUfdgtjntZ8Yb9n2jfjYc1aofctawb2wvoiqOMxe" +
                "68YKL1ht6tgIclADJrxGhjGbPpfUMqEMFXb8FWzVPDpIYlzbdSNhqVfK34yOLrg8" +
                "5NsCwrNcVLCRPdUJ/MQKkMTAJ5kmrHdsHkRZsEWmHblXL0MHsmVk";
            this.InitializeComponent();
            this.Suspending += OnSuspending;
        }

        /// <summary>
        /// Invoked when the application is launched normally by the end user.  Other entry points
        /// will be used when the application is launched to open a specific file, to display
        /// search results, and so forth.
        /// </summary>
        /// <param name="args">Details about the launch request and process.</param>
        protected override async void OnLaunched(LaunchActivatedEventArgs args)
        {
            Frame rootFrame = Window.Current.Content as Frame;

            // Do not repeat app initialization when the Window already has content,
            // just ensure that the window is active

            if (rootFrame == null)
            {
                // Create a Frame to act as the navigation context and navigate to the first page
                rootFrame = new Frame();
                //Associate the frame with a SuspensionManager key                                
                SuspensionManager.RegisterFrame(rootFrame, "AppFrame");

                if (args.PreviousExecutionState == ApplicationExecutionState.Terminated)
                {
                    // Restore the saved session state only when appropriate
                    try
                    {
                        await SuspensionManager.RestoreAsync();
                    }
                    catch (SuspensionManagerException)
                    {
                        //Something went wrong restoring state.
                        //Assume there is no state and continue
                    }
                }

                // Place the frame in the current Window
                Window.Current.Content = rootFrame;
            }
            if (rootFrame.Content == null)
            {
                // When the navigation stack isn't restored navigate to the first page,
                // configuring the new page by passing required information as a navigation
                // parameter
                if (!rootFrame.Navigate(typeof(MainPage), "AllItems"))
                {
                    throw new Exception(Strings.InitializationException);
                }
            }
            // Ensure the current window is active
            Window.Current.Activate();
        }

        /// <summary>
        /// Invoked when application execution is being suspended.  Application state is saved
        /// without knowing whether the application will be terminated or resumed with the contents
        /// of memory still intact.
        /// </summary>
        /// <param name="sender">The source of the suspend request.</param>
        /// <param name="e">Details about the suspend request.</param>
        private async void OnSuspending(object sender, SuspendingEventArgs e)
        {
            var deferral = e.SuspendingOperation.GetDeferral();
            await SuspensionManager.SaveAsync();
            deferral.Complete();
        }
    }
}
