/// <summary>
        /// Send usage stats to server.
        /// </summary>
        /// <param name="app">The program.</param>
        private static void SendUsageStats(this IDeckAdvisorProgram program)
        {
            program.Logger.Debug("SendUsageStats() Called - {0}", program.ApplicationName);

            new Task(() =>
            {
                AssemblyName assemblyName   = Assembly.GetExecutingAssembly().GetName();
                string assemblyVersion      = assemblyName.Version.ToString();
                string assemblyArchitecture = assemblyName.ProcessorArchitecture.ToString();

                NameValueCollection inputs = new NameValueCollection
                {
                    { "application", program.ApplicationUsageName },
                    { "fingerprint", program.CurrentApp.State.Fingerprint.ToString() },
                    { "version", assemblyVersion },
                    { "architecture", assemblyArchitecture }
                };
                string response = WebUtilities.UploadValues("https://clans.dailyarena.net/usage_stats.php", inputs, "POST", true, out List <WebException> exceptions);
                program.Logger.Debug("Usage Statistics Response: {response}", response);
                if (response == null)
                {
                    foreach (WebException exception in exceptions)
                    {
                        program.Logger.Error(exception, "Exception from UploadValues in {method}", "SendUsageStats");
                    }
                }
            }).Start();
        }
        /// <summary>
        /// Initialization extension for IDeckAdvisorProgram.
        /// </summary>
        /// <param name="app">The program.</param>
        public static void InitializeProgram(this IDeckAdvisorProgram program)
        {
            program.Logger.Debug("InitializeProgram() Called - {0}", program.ApplicationName);

            program.SetCulture();

            // these have to happen after SetCulture()
            program.FormatMappings = new Dictionary <string, Tuple <string, string> >()
            {
                { program.GetLocalizedString("Item_Standard"), new Tuple <string, string>("standard", "Standard") },
                { program.GetLocalizedString("Item_ArenaStandard"), new Tuple <string, string>("arena_standard", "ArenaStandard") },
                { program.GetLocalizedString("Item_Brawl"), new Tuple <string, string>("brawl", "Brawl") },
                { program.GetLocalizedString("Item_Historic_Bo3"), new Tuple <string, string>("historic_bo3", "Historic") },
                { program.GetLocalizedString("Item_Historic_Bo1"), new Tuple <string, string>("historic_bo1", "Historic") }
            };

            program.SendUsageStats();
        }
        /// <summary>
        /// Sets the current UI culture from app.config if it's set there.
        /// </summary>
        /// <param name="app">The program.</param>
        private static void SetCulture(this IDeckAdvisorProgram program)
        {
            program.Logger.Debug("SetCulture() Called - {0}", program.ApplicationName);

            string culture = program.GetConfigurationSetting("UICulture");

            if (culture != null)
            {
                program.Logger.Debug("Setting UI Culture to {culture}", culture);
                Thread.CurrentThread.CurrentUICulture = new CultureInfo(culture);
            }
            else
            {
                program.Logger.Debug("UICulture not set in configuration settings, Using Default UI Culture");
            }

            program.Logger.Debug("Current UI Culture: {CurrentUICulture}", Thread.CurrentThread.CurrentUICulture);
        }
        /// <summary>
        /// Initialize various state variables.
        /// </summary>
        /// <param name="app">The program.</param>
        public static void InitializeState(this IDeckAdvisorProgram program)
        {
            program.Logger.Debug("InitializeState() Called - {0}", program.ApplicationName);

            bool saveState = false;

            program.Format.Value = program.CurrentApp.State.LastFormat;
            if (string.IsNullOrWhiteSpace(program.Format.Value) || !program.FormatMappings.ContainsKey(program.Format.Value))
            {
                program.Format.Value = program.GetLocalizedString("Item_Standard");
                program.CurrentApp.State.LastFormat = program.Format.Value;
                saveState = true;
            }

            program.Sort.Value = program.CurrentApp.State.LastSort;
            List <string> sortStrings = new List <string>()
            {
                program.GetLocalizedString("Item_Default"),
                program.GetLocalizedString("Item_BoosterCost"),
                program.GetLocalizedString("Item_BoosterCostIgnoringWildcards"),
                program.GetLocalizedString("Item_BoosterCostIgnoringCollection"),
                program.GetLocalizedString("Item_DeckScore"),
                program.GetLocalizedString("Item_WinRate"),
                program.GetLocalizedString("Item_MythicRareCount"),
                program.GetLocalizedString("Item_RareCount"),
                program.GetLocalizedString("Item_UncommonCount"),
                program.GetLocalizedString("Item_CommonCount")
            };

            if (string.IsNullOrWhiteSpace(program.Sort.Value) || !sortStrings.Contains(program.Sort.Value))
            {
                program.Sort.Value = program.GetLocalizedString("Item_Default");
                program.CurrentApp.State.LastSort = program.Sort.Value;
                saveState = true;
            }

            program.SortDir.Value = program.CurrentApp.State.LastSortDir;
            List <string> sortDirStrings = new List <string>()
            {
                program.GetLocalizedString("Item_Default"),
                program.GetLocalizedString("Item_Ascending"),
                program.GetLocalizedString("Item_Descending")
            };

            if (string.IsNullOrWhiteSpace(program.SortDir.Value) || !sortDirStrings.Contains(program.SortDir.Value))
            {
                program.SortDir.Value = program.GetLocalizedString("Item_Default");
                program.CurrentApp.State.LastSortDir = program.SortDir.Value;
                saveState = true;
            }

            program.RotationProof.Value = program.CurrentApp.State.RotationProof;
            program.CardText.Value      = program.CurrentApp.State.CardTextFilter;

            int fontSize = program.CurrentApp.State.FontSize;

            if (fontSize < 8 || fontSize > 24)
            {
                program.SelectedFontSize.Value    = 12;
                program.CurrentApp.State.FontSize = program.SelectedFontSize.Value;
                saveState = true;
            }
            else
            {
                program.SelectedFontSize.Value = fontSize;
            }

            if (saveState)
            {
                program.CurrentApp.SaveState();
            }
        }