/**************************************************************************
* Copyright (C) 2016 by Savoir-faire Linux                                *
* Author: Jäger Nicolas <nicolas.jager@savoirfairelinux.com>              *
* Author: Traczyk Andreas <traczyk.andreas@savoirfairelinux.com>          *
*                                                                         *
* This program is free software; you can redistribute it and/or modify    *
* it under the terms of the GNU General Public License as published by    *
* the Free Software Foundation; either version 3 of the License, or       *
* (at your option) any later version.                                     *
*                                                                         *
* This program is distributed in the hope that it will be useful,         *
* but WITHOUT ANY WARRANTY; without even the implied warranty of          *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the           *
* GNU General Public License for more details.                            *
*                                                                         *
* You should have received a copy of the GNU General Public License       *
* along with this program.  If not, see <http://www.gnu.org/licenses/>.   *
**************************************************************************/
#include "pch.h"

#include "LoadingPage.xaml.h"

#include "MainPage.xaml.h"
#include "Wizard.xaml.h"

using namespace RingClientUWP;
using namespace RingClientUWP::Views;
using namespace RingClientUWP::ViewModel;

using namespace Platform;
using namespace Windows::ApplicationModel::Core;
using namespace Windows::Foundation;
using namespace Windows::Foundation::Collections;
using namespace Windows::UI::ViewManagement;
using namespace Windows::UI::Xaml;
using namespace Windows::UI::Xaml::Controls;
using namespace Windows::UI::Xaml::Controls::Primitives;
using namespace Windows::UI::Core;
using namespace Windows::UI::Xaml::Data;
using namespace Windows::UI::Xaml::Input;
using namespace Windows::UI::Xaml::Interop;
using namespace Windows::UI::Xaml::Navigation;
using namespace Windows::ApplicationModel::Activation;
using namespace Windows::Graphics::Display;
using namespace Windows::System;

LoadingPage::LoadingPage()
{
    InitializeComponent();

    Utils::fileExists(ApplicationData::Current->LocalFolder, ".config\\dring.yml")
    .then([this](bool config_exists)
    {
        if (config_exists) {
            Utils::fileExists(ApplicationData::Current->LocalFolder, "creation.token")
            .then([this](bool token_exists)
            {
                if (token_exists) {
                    /* we have a token, the config has to be considered as corrupted, summon the wizard */

                    Utils::fileExists(ApplicationData::Current->LocalFolder, ".config\\dring.yml")
                    .then([this](bool token_exists)
                    {
                        if (token_exists) {
                            StorageFolder^ storageFolder = ApplicationData::Current->LocalFolder;
                            task<StorageFile^>(storageFolder->GetFileAsync(".config\\dring.yml")).then([this](StorageFile^ folder)
                            {
                                folder->DeleteAsync();
                            });
                        }
                    });

                    this->Dispatcher->RunAsync(Windows::UI::Core::CoreDispatcherPriority::Normal, ref new Windows::UI::Core::DispatchedHandler([this]() {
                        this->Frame->Navigate(Windows::UI::Xaml::Interop::TypeName(Wizard::typeid));
                    }));
                }
                else {
                    /* there is no token and we have a config.yml, summon the main page */
                    this->Dispatcher->RunAsync(Windows::UI::Core::CoreDispatcherPriority::Normal, ref new Windows::UI::Core::DispatchedHandler([this]() {
                        this->Frame->Navigate(Windows::UI::Xaml::Interop::TypeName(MainPage::typeid));
                    }));
                }
            });
        }
        else {
            /* no config file, create the token and summon the wizard*/
            StorageFolder^ storageFolder = ApplicationData::Current->LocalFolder;

            storageFolder->CreateFileAsync("creation.token", CreationCollisionOption::ReplaceExisting);

            this->Dispatcher->RunAsync(Windows::UI::Core::CoreDispatcherPriority::Normal, ref new Windows::UI::Core::DispatchedHandler([this] () {
                this->Frame->Navigate(Windows::UI::Xaml::Interop::TypeName(Wizard::typeid));
            }));
        }
    });
}