//======================================================================
        // Set the wallpaper
        //======================================================================
        public async Task <bool> SetWallpaperAsync(RedditLink redditLink)
        {
            Logger.Instance.LogMessageToFile("Setting wallpaper.", LogLevel.Information);

            if (!await WallpaperLinkValidAsync(redditLink).ConfigureAwait(false))
            {
                return(false);
            }

            HelperMethods.ResetManualOverride();

            _uiMarshaller.UpdateStatus("Setting Wallpaper");

            if (!string.IsNullOrEmpty(redditLink.Url))
            {
                redditLink.Url = await ConvertRedditLinkToImageLink(redditLink.Url, _random, ImageExtensions).ConfigureAwait(false);

                var uri           = new Uri(redditLink.Url);
                var extension     = Path.GetExtension(uri.LocalPath);
                var fileName      = $"{redditLink.ThreadId}{extension}";
                var wallpaperFile = Path.Combine(Path.GetTempPath(), fileName);

                redditLink.SaveAsCurrentWallpaper(extension, wallpaperFile);
                redditLink.LogDetails();

                if (ImageExtensions.Contains(extension.ToUpper()))
                {
                    await DownloadWallpaperAsync(uri.AbsoluteUri, wallpaperFile);

                    if (!await SetWallpaperAsync(redditLink, wallpaperFile))
                    {
                        return(false);
                    }
                }
                else
                {
                    Logger.Instance.LogMessageToFile($"Wallpaper URL failed validation: {extension.ToUpper()}", LogLevel.Warning);

                    _uiMarshaller.RestartChangeWallpaperTimer();
                }

                using (var wc = HelperMethods.CreateWebClient())
                {
                    var bytes = await wc.DownloadDataTaskAsync(uri).ConfigureAwait(false);

                    if (!bytes.Any())
                    {
                        _uiMarshaller.RestartChangeWallpaperTimer();
                    }
                }
            }
            else
            {
                _uiMarshaller.RestartChangeWallpaperTimer();
            }

            return(true);
        }
        // TODO refactor
        private static string GetRedditSearchUrl(Random random, MainThreadMarshaller uiMarshaller)
        {
            var query = WebUtility.UrlEncode(Settings.Default.searchQuery) +
                        "+self%3Ano+((url%3A.png+OR+url%3A.jpg+OR+url%3A.jpeg)+OR+(url%3Aimgur.png+OR+url%3Aimgur.jpg+OR+url%3Aimgur.jpeg)+OR+(url%3Adeviantart))";

            var subreddits = new StringBuilder(Settings.Default.subredditsUsed).Replace(" ", "")
                             .Replace("www.reddit.com/", "")
                             .Replace("reddit.com/", "")
                             .Replace("http://", "")
                             .Replace("/r/", "")
                             .ToString();
            var subs = subreddits.Split('+');
            var sub  = subs[random.Next(0, subs.Length)];

            uiMarshaller.UpdateStatus("Searching /r/" + sub + " for a wallpaper...");
            Logger.Instance.LogMessageToFile("Selected sub to search: " + sub, LogLevel.Information);

            var formURL = new StringBuilder("http://www.reddit.com/");

            if (!sub.Any())
            {
                formURL.Append("r/all");
            }
            else if (sub.Contains("/m/"))
            {
                formURL.Append(subreddits)
                .Replace("http://", "")
                .Replace("https://", "")
                .Replace("user/", "u/");
            }
            else
            {
                formURL.Append($"r/").Append(sub);
            }

            switch ((WallpaperGrabType)Settings.Default.wallpaperGrabType)
            {
            case WallpaperGrabType.Random:
                formURL.Append("/search.json?q=")
                .Append(query)
                .Append(SortValues[random.Next(0, 4)])
                .Append(TopValues[random.Next(0, 5)])
                .Append("&restrict_sr=on");
                Logger.Instance.LogMessageToFile("Full URL Search String: " + formURL, LogLevel.Information);
                break;

            case WallpaperGrabType.Newest:
                formURL.Append("/search.json?q=")
                .Append(query)
                .Append("&sort=new&restrict_sr=on");
                Logger.Instance.LogMessageToFile("Full URL Search String: " + formURL, LogLevel.Information);
                break;

            case WallpaperGrabType.HotToday:
                formURL.Append("/search.json?q=")
                .Append(query)
                .Append("&sort=hot&restrict_sr=on&t=day");
                Logger.Instance.LogMessageToFile("Full URL Search String: " + formURL, LogLevel.Information);
                break;

            case WallpaperGrabType.TopLastHour:
                formURL.Append("/search.json?q=")
                .Append(query)
                .Append("&sort=top&restrict_sr=on&t=hour");
                Logger.Instance.LogMessageToFile("Full URL Search String: " + formURL, LogLevel.Information);
                break;

            case WallpaperGrabType.TopToday:
                formURL.Append("/search.json?q=")
                .Append(query)
                .Append("&sort=top&restrict_sr=on&t=day");
                Logger.Instance.LogMessageToFile("Full URL Search String: " + formURL, LogLevel.Information);
                break;

            case WallpaperGrabType.TopWeek:
                formURL.Append("/search.json?q=")
                .Append(query)
                .Append("&sort=top&restrict_sr=on&t=week");
                Logger.Instance.LogMessageToFile("Full URL Search String: " + formURL, LogLevel.Information);
                break;

            case WallpaperGrabType.TopMonth:
                formURL.Append("/search.json?q=")
                .Append(query)
                .Append("&sort=top&restrict_sr=on&t=month");
                Logger.Instance.LogMessageToFile("Full URL Search String: " + formURL, LogLevel.Information);
                break;

            case WallpaperGrabType.TopYear:
                formURL.Append("/search.json?q=")
                .Append(query)
                .Append("&sort=top&restrict_sr=on&t=year");
                Logger.Instance.LogMessageToFile("Full URL Search String: " + formURL, LogLevel.Information);
                break;

            case WallpaperGrabType.TopAllTime:
                formURL.Append("/search.json?q=")
                .Append(query)
                .Append("&sort=top&restrict_sr=on&t=all");
                Logger.Instance.LogMessageToFile("Full URL Search String: " + formURL, LogLevel.Information);
                break;

            case WallpaperGrabType.TrulyRandom:
                formURL.Append("/random.json?p=").Append(Guid.NewGuid());
                Logger.Instance.LogMessageToFile("Full URL Search String: " + formURL, LogLevel.Information);
                break;
            }

            return(formURL.ToString());
        }