public void CopyReplayFiles()
        {
            if (Config.Instance.SaveDataInAppData == null)
            {
                return;
            }
            var appDataReplayDirPath = Config.Instance.AppDataPath + @"\Replays";
            var dataReplayDirPath    = Config.Instance.DataDirPath + @"\Replays";

            if (Config.Instance.SaveDataInAppData.Value)
            {
                if (Directory.Exists(dataReplayDirPath))
                {
                    //backup in case the file already exists
                    var time = DateTime.Now.ToFileTime();
                    if (Directory.Exists(appDataReplayDirPath))
                    {
                        Helper.CopyFolder(appDataReplayDirPath, appDataReplayDirPath + time);
                        Directory.Delete(appDataReplayDirPath, true);
                        Logger.WriteLine("Created backups of replays in appdata", "Load");
                    }


                    Helper.CopyFolder(dataReplayDirPath, appDataReplayDirPath);
                    Directory.Delete(dataReplayDirPath, true);

                    Logger.WriteLine("Moved replays to appdata", "Load");
                }
            }
            else if (Directory.Exists(appDataReplayDirPath))            //Save in DataDir and AppData Replay dir still exists
            {
                //backup in case the file already exists
                var time = DateTime.Now.ToFileTime();
                if (Directory.Exists(dataReplayDirPath))
                {
                    Helper.CopyFolder(dataReplayDirPath, dataReplayDirPath + time);
                    Directory.Delete(dataReplayDirPath, true);
                }
                Logger.WriteLine("Created backups of replays locally", "Load");


                Helper.CopyFolder(appDataReplayDirPath, dataReplayDirPath);
                Directory.Delete(appDataReplayDirPath, true);
                Logger.WriteLine("Moved replays to appdata", "Load");
            }
        }
        public void SetupDeckStatsFile()
        {
            if (Config.Instance.SaveDataInAppData == null)
            {
                return;
            }
            var appDataPath         = Config.Instance.AppDataPath + @"\DeckStats.xml";
            var appDataGamesDirPath = Config.Instance.AppDataPath + @"\Games";
            var dataDirPath         = Config.Instance.DataDirPath + @"\DeckStats.xml";
            var dataGamesDirPath    = Config.Instance.DataDirPath + @"\Games";

            if (Config.Instance.SaveDataInAppData.Value)
            {
                if (File.Exists(dataDirPath))
                {
                    if (File.Exists(appDataPath))
                    {
                        //backup in case the file already exists
                        var time = DateTime.Now.ToFileTime();
                        File.Move(appDataPath, appDataPath + time);
                        if (Directory.Exists(appDataGamesDirPath))
                        {
                            Helper.CopyFolder(appDataGamesDirPath, appDataGamesDirPath + time);
                            Directory.Delete(appDataGamesDirPath, true);
                        }
                        Logger.WriteLine("Created backups of DeckStats and Games in appdata", "Load");
                    }
                    File.Move(dataDirPath, appDataPath);
                    Logger.WriteLine("Moved DeckStats to appdata", "Load");
                    if (Directory.Exists(dataGamesDirPath))
                    {
                        Helper.CopyFolder(dataGamesDirPath, appDataGamesDirPath);
                        Directory.Delete(dataGamesDirPath, true);
                    }
                    Logger.WriteLine("Moved Games to appdata", "Load");
                }
            }
            else if (File.Exists(appDataPath))
            {
                if (File.Exists(dataDirPath))
                {
                    //backup in case the file already exists
                    var time = DateTime.Now.ToFileTime();
                    File.Move(dataDirPath, dataDirPath + time);
                    if (Directory.Exists(dataGamesDirPath))
                    {
                        Helper.CopyFolder(dataGamesDirPath, dataGamesDirPath + time);
                        Directory.Delete(dataGamesDirPath, true);
                    }
                    Logger.WriteLine("Created backups of deckstats and games locally", "Load");
                }
                File.Move(appDataPath, dataDirPath);
                Logger.WriteLine("Moved DeckStats to local", "Load");
                if (Directory.Exists(appDataGamesDirPath))
                {
                    Helper.CopyFolder(appDataGamesDirPath, dataGamesDirPath);
                    Directory.Delete(appDataGamesDirPath, true);
                }
                Logger.WriteLine("Moved Games to appdata", "Load");
            }

            var filePath = Config.Instance.DataDir + "DeckStats.xml";

            //create file if it does not exist
            if (!File.Exists(filePath))
            {
                using (var sr = new StreamWriter(filePath, false))
                    sr.WriteLine("<DeckStatsList></DeckStatsList>");
            }
        }
        public MainWindow()
        {
            // Set working directory to path of executable
            Directory.SetCurrentDirectory(AppDomain.CurrentDomain.BaseDirectory);

            InitializeComponent();

            Trace.Listeners.Add(new TextBoxTraceListener(Options.TextBoxLog));

            EnableMenuItems(false);

            try
            {
                if (File.Exists("Updater_new.exe"))
                {
                    if (File.Exists("Updater.exe"))
                    {
                        File.Delete("Updater.exe");
                    }
                    File.Move("Updater_new.exe", "Updater.exe");
                }
            }
            catch
            {
                Logger.WriteLine("Error updating updater");
            }

            Helper.MainWindow = this;
            /*_configPath =*/
            Config.Load();
            HsLogReader.Create();

            var configVersion = string.IsNullOrEmpty(Config.Instance.CreatedByVersion)
                                    ? null
                                    : new Version(Config.Instance.CreatedByVersion);

            Version currentVersion;

            if (Config.Instance.CheckForUpdates)
            {
                currentVersion   = Helper.CheckForUpdates(out NewVersion);
                _lastUpdateCheck = DateTime.Now;
            }
            else
            {
                currentVersion = Helper.GetCurrentVersion();
            }

            var versionString = string.Empty;

            if (currentVersion != null)
            {
                versionString             = string.Format("{0}.{1}.{2}", currentVersion.Major, currentVersion.Minor, currentVersion.Build);
                Help.TxtblockVersion.Text = "Version: " + versionString;

                // Assign current version to the config instance so that it will be saved when the config
                // is rewritten to disk, thereby telling us what version of the application created it
                Config.Instance.CreatedByVersion = currentVersion.ToString();
            }

            ConvertLegacyConfig(currentVersion, configVersion);

            if (Config.Instance.SelectedTags.Count == 0)
            {
                Config.Instance.SelectedTags.Add("All");
            }

            _foundHsDirectory = FindHearthstoneDir();

            if (_foundHsDirectory)
            {
                _updatedLogConfig = UpdateLogConfigFile();
            }

            //hearthstone, loads db etc - needs to be loaded before playerdecks, since cards are only saved as ids now
            Game.Reset();

            _decksPath = Config.Instance.DataDir + "PlayerDecks.xml";
            SetupDeckListFile();
            try
            {
                DeckList = XmlManager <Decks> .Load(_decksPath);
            }
            catch (Exception e)
            {
                MessageBox.Show(
                    e.Message + "\n\n" + e.InnerException +
                    "\n\n If you don't know how to fix this, please delete " + _decksPath +
                    " (this will cause you to lose your decks).",
                    "Error loading PlayerDecks.xml");
                Application.Current.Shutdown();
            }

            foreach (var deck in DeckList.DecksList)
            {
                DeckPickerList.AddDeck(deck);
            }

            SetupDefaultDeckStatsFile();
            DefaultDeckStats.Load();


            SetupDeckStatsFile();
            DeckStatsList.Load();

            _notifyIcon = new NotifyIcon {
                Icon = new Icon(@"Images/HearthstoneDeckTracker16.ico"), Visible = true, ContextMenu = new ContextMenu(), Text = "Hearthstone Deck Tracker v" + versionString
            };
            _notifyIcon.ContextMenu.MenuItems.Add("Use no deck", (sender, args) => DeselectDeck());
            _notifyIcon.ContextMenu.MenuItems.Add(new MenuItem("Autoselect deck")
            {
                MenuItems =
                {
                    new MenuItem("On",
                                 (sender, args) =>
                                 AutoDeckDetection(true)),
                    new MenuItem("Off",
                                 (sender, args) =>
                                 AutoDeckDetection(false))
                }
            }); _notifyIcon.ContextMenu.MenuItems.Add(new MenuItem("Class cards first")
            {
                MenuItems =
                {
                    new MenuItem("Yes",
                                 (sender, args) =>
                                 SortClassCardsFirst(true)),
                    new MenuItem("No",
                                 (sender, args) =>
                                 SortClassCardsFirst(false))
                }
            });
            _notifyIcon.ContextMenu.MenuItems.Add("Show", (sender, args) => ActivateWindow());
            _notifyIcon.ContextMenu.MenuItems.Add("Exit", (sender, args) => Close());
            _notifyIcon.MouseClick += (sender, args) => { if (args.Button == MouseButtons.Left)
                                                          {
                                                              ActivateWindow();
                                                          }
            };

            //create overlay
            Overlay = new OverlayWindow {
                Topmost = true
            };

            PlayerWindow   = new PlayerWindow(Config.Instance, Game.IsUsingPremade ? Game.PlayerDeck : Game.PlayerDrawn);
            OpponentWindow = new OpponentWindow(Config.Instance, Game.OpponentCards);
            TimerWindow    = new TimerWindow(Config.Instance);
            StatsWindow    = new StatsWindow();

            if (Config.Instance.PlayerWindowOnStart)
            {
                PlayerWindow.Show();
            }
            if (Config.Instance.OpponentWindowOnStart)
            {
                OpponentWindow.Show();
            }
            if (Config.Instance.TimerWindowOnStartup)
            {
                TimerWindow.Show();
            }
            if (!DeckList.AllTags.Contains("All"))
            {
                DeckList.AllTags.Add("All");
                WriteDecks();
            }
            if (!DeckList.AllTags.Contains("Favorite"))
            {
                if (DeckList.AllTags.Count > 1)
                {
                    DeckList.AllTags.Insert(1, "Favorite");
                }
                else
                {
                    DeckList.AllTags.Add("Favorite");
                }
                WriteDecks();
            }
            if (!DeckList.AllTags.Contains("Arena"))
            {
                DeckList.AllTags.Add("Arena");
                WriteDecks();
            }
            if (!DeckList.AllTags.Contains("Constructed"))
            {
                DeckList.AllTags.Add("Constructed");
                WriteDecks();
            }
            if (!DeckList.AllTags.Contains("None"))
            {
                DeckList.AllTags.Add("None");
                WriteDecks();
            }

            Options.ComboboxAccent.ItemsSource    = ThemeManager.Accents;
            Options.ComboboxTheme.ItemsSource     = ThemeManager.AppThemes;
            Options.ComboboxLanguages.ItemsSource = Helper.LanguageDict.Keys;

            Options.ComboboxKeyPressGameStart.ItemsSource = EventKeys;
            Options.ComboboxKeyPressGameEnd.ItemsSource   = EventKeys;

            LoadConfig();

            FillElementSorters();

            //this has to happen before reader starts
            var lastDeck = DeckList.DecksList.FirstOrDefault(d => d.Name == Config.Instance.LastDeck);

            DeckPickerList.SelectDeck(lastDeck);

            TurnTimer.Create(90);

            SortFilterDecksFlyout.HideStuffToCreateNewTag();
            TagControlEdit.OperationSwitch.Visibility = Visibility.Collapsed;
            TagControlEdit.PnlSortDecks.Visibility    = Visibility.Collapsed;


            UpdateDbListView();

            _doUpdate = _foundHsDirectory;
            UpdateOverlayAsync();

            _initialized = true;
            Options.MainWindowInitialized();

            DeckPickerList.UpdateList();
            if (lastDeck != null)
            {
                DeckPickerList.SelectDeck(lastDeck);
                UpdateDeckList(lastDeck);
                UseDeck(lastDeck);
            }

            if (_foundHsDirectory)
            {
                HsLogReader.Instance.Start();
            }

            Helper.SortCardCollection(ListViewDeck.Items, Config.Instance.CardSortingClassFirst);
            DeckPickerList.SortDecks();

            // Set Language
            var culture = Config.Instance.SelectedLanguage.Insert(2, "-");

            WPFLocalizeExtension.Engine.LocalizeDictionary.Instance.Culture = System.Globalization.CultureInfo.GetCultureInfo(culture);
            if (!Directory.Exists(culture))
            {
                var langPath = Path.Combine("Lang", culture);
                if (Directory.Exists(langPath))
                {
                    Helper.CopyFolder(langPath, culture);
                    _showRestartMessage = true;
                }
            }
        }
        private void SetupDeckStatsFile()
        {
            if (Config.Instance.SaveDataInAppData == null)
            {
                return;
            }
            var          appDataPath         = Config.Instance.AppDataPath + @"\DeckStats.xml";
            var          appDataGamesDirPath = Config.Instance.AppDataPath + @"\Games";
            const string localPath           = "DeckStats.xml";
            const string localGamesDirPath   = "Games";

            if (Config.Instance.SaveDataInAppData.Value)
            {
                if (File.Exists(localPath))
                {
                    if (File.Exists(appDataPath))
                    {
                        //backup in case the file already exists
                        var time = DateTime.Now.ToFileTime();
                        File.Move(appDataPath, appDataPath + time);
                        if (Directory.Exists(appDataGamesDirPath))
                        {
                            Helper.CopyFolder(appDataGamesDirPath, appDataGamesDirPath + time);
                            Directory.Delete(appDataGamesDirPath, true);
                        }
                        Logger.WriteLine("Created backups of deckstats and games in appdata");
                    }
                    File.Move(localPath, appDataPath);
                    Logger.WriteLine("Moved DeckStats to appdata");
                    if (Directory.Exists(localGamesDirPath))
                    {
                        Helper.CopyFolder(localGamesDirPath, appDataGamesDirPath);
                        Directory.Delete(localGamesDirPath, true);
                    }
                    Logger.WriteLine("Moved Games to appdata");
                }
            }
            else if (File.Exists(appDataPath))
            {
                if (File.Exists(localPath))
                {
                    //backup in case the file already exists
                    var time = DateTime.Now.ToFileTime();
                    File.Move(localPath, localPath + time);
                    if (Directory.Exists(localGamesDirPath))
                    {
                        Helper.CopyFolder(localGamesDirPath, localGamesDirPath + time);
                        Directory.Delete(localGamesDirPath, true);
                    }
                    Logger.WriteLine("Created backups of deckstats and games locally");
                }
                File.Move(appDataPath, localPath);
                Logger.WriteLine("Moved DeckStats to local");
                if (Directory.Exists(appDataGamesDirPath))
                {
                    Helper.CopyFolder(appDataGamesDirPath, localGamesDirPath);
                    Directory.Delete(appDataGamesDirPath, true);
                }
                Logger.WriteLine("Moved Games to appdata");
            }

            var filePath = Config.Instance.DataDir + "DeckStats.xml";

            //load saved decks
            if (!File.Exists(filePath))
            {
                //avoid overwriting decks file with new releases.
                using (var sr = new StreamWriter(filePath, false))
                    sr.WriteLine("<DeckStatsList></DeckStatsList>");
            }
        }