/// <summary>
        /// Get the notifications for the nex 15 minutes
        /// </summary>
        async Task GetUpcomingNotifications()
        {
            try
            {
                var client = new BMAStaticDataService.StaticClient();
                var result = await client.GetUpcomingNotificationsAsync(DateTime.Now);

                if (result.Count == 0)
                    return;

                List<int> durationList = new List<int>();
                foreach (var item in result)
                {
                    TimeSpan ts1 = new TimeSpan(item.Time.Hour, item.Time.Minute, 0);
                    TimeSpan ts2 = new TimeSpan(DateTime.Now.Hour, DateTime.Now.Minute, 0);
                    
                    int duration = Convert.ToInt32(Math.Round(ts1.Subtract(ts2).Duration().TotalMinutes, MidpointRounding.AwayFromZero));

                    durationList.Add(duration);
                }


                if (durationList.Count() > 0)
                {
                    ShowNotification(durationList);
                    SetupTiles(durationList);
                }
            }
            catch (Exception)
            {
                
                throw;
            }
        }
 public async Task ForgotPassword(User user)
 {
     try
     {
         var client = new BMAStaticDataService.StaticClient();
         var result = await client.ForgotPasswordAsync(user);
     }
     catch (Exception)
     {
         throw;
     }
 }
        public async Task RegisterUser(User user)
        {
            try
            {
                var client = new BMAStaticDataService.StaticClient();
                var result = await client.RegisterUserAsync(user);

                user.HasChanges = false;
                user.UserId = result.UserId;
            }
            catch (Exception)
            {
                throw;
            }
        }
        public async Task ChangePassword(User user)
        {
            try
            {
                var client = new BMAStaticDataService.StaticClient();
                var result = await client.ChangePasswordAsync(user);

                user.HasChanges = false;
                user.Password = result.Password;
            }
            catch (Exception)
            {
                throw;
            }
        }
        public async Task SaveInterval(ObservableCollection<TypeInterval> typeInterval)
        {
            try
            {
                var client = new BMAStaticDataService.StaticClient();
                var result = await client.SaveTypeIntervalsAsync(typeInterval);

                await UpdateCacheTypeInterval(result);
                LoadIntervalData(result);
            }
            catch (Exception)
            {
                throw;
            }
        }
        public async Task SaveBudgetThreshold(ObservableCollection<BudgetThreshold> budgetThreshold)
        {
            try
            {
                var client = new BMAStaticDataService.StaticClient();
                var result = await client.SaveBudgetThresholdsAsync(budgetThreshold);

                await UpdateCacheBudgetThresholds(result);
                LoadBudgetThresholdData(result);
            }
            catch (Exception)
            {
                throw;
            }
        }
        public async Task SaveTypeFrequency(ObservableCollection<TypeFrequency> typeFrequency)
        {
            try
            {
                var client = new BMAStaticDataService.StaticClient();
                var result = await client.SaveTypeFrequenciesAsync(typeFrequency);

                await UpdateCacheTypeFrequency(result);
                LoadTypeFrequencyData(result);
            }
            catch (Exception)
            {
                throw;
            }
        }
        public async Task SaveTypeTransaction(ObservableCollection<TypeTransaction> typeTransaction)
        {
            try
            {
                var client = new BMAStaticDataService.StaticClient();
                var result = await client.SaveTypeTransactionsAsync(typeTransaction);

                await UpdateCacheTypeTransaction(result);
                LoadTypeTransactionData(result);
            }
            catch (Exception)
            {
                throw;
            }
        }
        public async Task SaveCategory(ObservableCollection<Category> categories)
        {
            try
            {
                var client = new BMAStaticDataService.StaticClient();
                var result = await client.SaveCategoriesAsync(categories);

                await UpdateCacheCategory(result);
                LoadTypeCategoryData(result);
            }
            catch (Exception)
            {
                throw;
            }
        }
        public async Task SyncStaticData()
        {
            try
            {
                var staticData = new StaticTypeList();

                staticData.BudgetThresholds = await LoadCachedBudgetThreshold(STATIC_BUDGETTHRESHOLD_FOLDER);
                staticData.Categories = await LoadCachedCategory(STATIC_CATEGORY_FOLDER);
                staticData.TypeIntervals = await LoadCachedInterval(STATIC_TYPEINTERVAL_FOLDER);
                staticData.Notifications = await LoadCachedNotification(STATIC_NOTIFICATION_FOLDER);
                staticData.TypeFrequencies = await LoadCachedTypeFrequency(STATIC_TYPEFREQUENCY_FOLDER);
                //staticData.TypeSavingsDencities = await LoadCachedTypeSavingsDencity(STATIC_TYPESAVINGFREQUENCY_FOLDER);
                staticData.TypeTransactions = await LoadCachedTypeTransaction(STATIC_TYPETRANSACTION_FOLDER);
                staticData.TypeTransactionReasons = await LoadCachedTypeTransactionReason(STATIC_TYPETRANSACTIONREASON_FOLDER);

                var client = new BMAStaticDataService.StaticClient();
                var result = await client.SyncStaticDataAsync(staticData);

                ApplicationData.Current.LocalSettings.Values["IsSync"] = true;

                await UpdateCacheBudgetThresholds(result.BudgetThresholds);
                await UpdateCacheCategory(result.Categories);
                await UpdateCacheNotification(result.Notifications);
                await UpdateCacheTypeFrequency(result.TypeFrequencies);
                await UpdateCacheTypeInterval(result.TypeIntervals);
                //await UpdateCacheTypeSavingsDencity(result.TypeSavingsDencities);
                await UpdateCacheTypeTransaction(result.TypeTransactions);
                await UpdateCacheTypeTransactionReason(result.TypeTransactionReasons);

                LoadBudgetThresholdData(result.BudgetThresholds);
                LoadTypeCategoryData(result.Categories);
                LoadTypeFrequencyData(result.TypeFrequencies);
                LoadTypeSavingsDencityData(result.TypeSavingsDencities);
                LoadTypeTransactionData(result.TypeTransactions);
                LoadTypeTransactionReasonData(result.TypeTransactionReasons);
                LoadNotificationData(result.Notifications);
                LoadIntervalData(result.TypeIntervals);

            }
            catch (Exception)
            {
                throw;
            }
        }
        private static async Task<User> LoadLiveUser(User user)
        {
            User retVal = null;
            var info = NetworkInformation.GetInternetConnectionProfile();

            if (info == null || info.GetNetworkConnectivityLevel() != NetworkConnectivityLevel.InternetAccess)
            {
                return retVal;
            }

            try
            {
                var client = new BMAStaticDataService.StaticClient();
                var result = await client.AuthenticateUserAsync(user);

                retVal = result;
            }
            catch (Exception ex)
            {
                var dialog = new MessageDialog(string.Format("There was an error accessing the weather service.\n\r{0}", ex.Message));
                throw;
            }

            return retVal;
        }