public void ConvertDB(IPlayniteAPI PlayniteApi)
        {
            GlobalProgressOptions globalProgressOptions = new GlobalProgressOptions(
                "SystemChecker - Database migration",
                false
                );

            globalProgressOptions.IsIndeterminate = true;

            PlayniteApi.Dialogs.ActivateGlobalProgress((activateGlobalProgress) =>
            {
                Stopwatch stopWatch = new Stopwatch();
                stopWatch.Start();

                logger.Info($"SystemChecker - ConvertDB()");

                int Converted = 0;

                foreach (var item in Items)
                {
                    try
                    {
                        if (PlayniteApi.Database.Games.Get(item.Key) != null)
                        {
                            GameRequierements gameRequierements = SystemChecker.PluginDatabase.Get(item.Key, true);

                            Requirement Minimum = item.Value.Minimum;
                            Minimum.IsMinimum   = true;

                            Requirement Recommanded = item.Value.Recommanded;

                            gameRequierements.Items = new List <Requirement> {
                                Minimum, Recommanded
                            };

                            Thread.Sleep(10);
                            SystemChecker.PluginDatabase.Update(gameRequierements);
                            Converted++;
                        }
                        else
                        {
                            logger.Warn($"SystemChecker - Game is deleted - {item.Key.ToString()}");
                        }
                    }
                    catch (Exception ex)
                    {
                        Common.LogError(ex, "SystemChecker", $"Failed to load ConvertDB from {item.Key.ToString()}");
                    }
                }

                logger.Info($"SystemChecker - Converted {Converted} / {Items.Count}");

                stopWatch.Stop();
                TimeSpan ts = stopWatch.Elapsed;
                logger.Info($"SystemChecker - Migration - {String.Format("{0:00}:{1:00}.{2:00}", ts.Minutes, ts.Seconds, ts.Milliseconds / 10)}");
            }, globalProgressOptions);

            IsOld = false;
        }
        public SystemCheckerGameView(IPlayniteAPI PlayniteApi, string PluginUserDataPath, Game GameSelected)
        {
            this.PlayniteApi = PlayniteApi;

            InitializeComponent();

            // Local
            SystemConfiguration systemConfiguration = PluginDatabase.Database.PC;

            LocalOs                = systemConfiguration.Os;
            LocalCpu               = systemConfiguration.Cpu;
            LocalRamUsage          = systemConfiguration.RamUsage;
            LocalGpu               = systemConfiguration.GpuName;
            LocalDisks.ItemsSource = systemConfiguration.Disks;


            // Minimum & Recommanded
            GameRequierements gameRequierements = PluginDatabase.Get(GameSelected, true);

            Requirement Minimum     = gameRequierements.GetMinimum();
            Requirement Recommanded = gameRequierements.GetRecommanded();

            if (Minimum.HasData)
            {
                MinimumOs       = "Windows " + string.Join(" / ", Minimum.Os);
                MinimumCpu      = Minimum.Cpu;
                MinimumRamUsage = Minimum.RamUsage;
                MinimumGpu      = Minimum.Gpu;
                MinimumStorage  = Minimum.StorageUsage;
            }

            if (Recommanded.HasData)
            {
                RecommandedOs       = "Windows " + string.Join(" / ", Recommanded.Os);
                RecommandedCpu      = Recommanded.Cpu;
                RecommandedRamUsage = Recommanded.RamUsage;
                RecommandedGpu      = Recommanded.Gpu;
                RecommandedStorage  = Recommanded.StorageUsage;
            }


            // Check config
            string IsOk = "";
            string IsKo = "";

            CheckSystem CheckMinimum = SystemApi.CheckConfig(Minimum, systemConfiguration);

            if (Minimum.HasData)
            {
                MinimumCheckOs = IsKo;
                if (CheckMinimum.CheckOs)
                {
                    MinimumCheckOs = IsOk;
                }
                if (Minimum.Os.Count == 0)
                {
                    MinimumCheckOs = string.Empty;
                }

                MinimumCheckCpu = IsKo;
                if (CheckMinimum.CheckCpu)
                {
                    MinimumCheckCpu = IsOk;
                }
                if (Minimum.Cpu.Count == 0)
                {
                    MinimumCheckCpu = string.Empty;
                }

                MinimumCheckRam = IsKo;
                if (CheckMinimum.CheckRam)
                {
                    MinimumCheckRam = IsOk;
                }
                if (Minimum.Ram == 0)
                {
                    MinimumCheckRam = string.Empty;
                }

                MinimumCheckGpu = IsKo;
                if (CheckMinimum.CheckGpu)
                {
                    MinimumCheckGpu = IsOk;
                }
                if (Minimum.Gpu.Count == 0)
                {
                    MinimumCheckGpu = string.Empty;
                }

                MinimumCheckStorage = IsKo;
                if (CheckMinimum.CheckStorage)
                {
                    MinimumCheckStorage = IsOk;
                }
                if (Minimum.Storage == 0)
                {
                    MinimumCheckStorage = string.Empty;
                }
            }

            CheckSystem CheckRecommanded = SystemApi.CheckConfig(Recommanded, systemConfiguration);

            if (Recommanded.HasData)
            {
                RecommandedCheckOs = IsKo;
                if (CheckRecommanded.CheckOs)
                {
                    RecommandedCheckOs = IsOk;
                }
                if (Recommanded.Os.Count == 0)
                {
                    RecommandedCheckOs = string.Empty;
                }

                RecommandedCheckCpu = IsKo;
                if (CheckRecommanded.CheckCpu)
                {
                    RecommandedCheckCpu = IsOk;
                }
                if (Recommanded.Cpu.Count == 0)
                {
                    RecommandedCheckCpu = string.Empty;
                }

                RecommandedCheckRam = IsKo;
                if (CheckRecommanded.CheckRam)
                {
                    RecommandedCheckRam = IsOk;
                }
                if (Recommanded.Ram == 0)
                {
                    RecommandedCheckRam = string.Empty;
                }

                RecommandedCheckGpu = IsKo;
                if (CheckRecommanded.CheckGpu)
                {
                    RecommandedCheckGpu = IsOk;
                }
                if (Recommanded.Gpu.Count == 0)
                {
                    RecommandedCheckGpu = string.Empty;
                }

                RecommandedCheckStorage = IsKo;
                if (CheckRecommanded.CheckStorage)
                {
                    RecommandedCheckStorage = IsOk;
                }
                if (Recommanded.Storage == 0)
                {
                    RecommandedCheckStorage = string.Empty;
                }
            }

            btLink.Visibility = System.Windows.Visibility.Hidden;
            if (Minimum.HasData || Recommanded.HasData)
            {
                btLink.Visibility = System.Windows.Visibility.Visible;
                btLink.Tag        = gameRequierements.Link;
            }

#if DEBUG
            logger.Debug("CheckMinimum" + JsonConvert.SerializeObject(CheckMinimum));
            logger.Debug("CheckRecommanded" + JsonConvert.SerializeObject(CheckRecommanded));
#endif

            if (!gameRequierements.SourceGameName.IsNullOrEmpty() && !gameRequierements.SourceName.IsNullOrEmpty())
            {
                ScSourceName = resources.GetString("LOCSourceLabel") + ": " + gameRequierements.SourceGameName + $" ({gameRequierements.SourceName})";
            }
            else
            {
                ScSourceName = resources.GetString("LOCSourceLabel") + ": " + GameSelected.Name;
            }

            DataContext = this;
        }
        public override void RefreshElements(Game GameSelected, bool force = false)
        {
            CancellationTokenSource tokenSource = new CancellationTokenSource();
            CancellationToken       ct          = tokenSource.Token;

            Task TaskRefresh = Task.Run(() =>
            {
                try
                {
                    Initial();

                    // Reset resources
                    List <ResourcesList> resourcesLists = new List <ResourcesList>();
                    resourcesLists.Add(new ResourcesList {
                        Key = "Scheck_HasData", Value = false
                    });
                    resourcesLists.Add(new ResourcesList {
                        Key = "Scheck_IsMinimumOK", Value = false
                    });
                    resourcesLists.Add(new ResourcesList {
                        Key = "Scheck_IsRecommandedOK", Value = false
                    });
                    resourcesLists.Add(new ResourcesList {
                        Key = "Scheck_IsAllOK", Value = false
                    });
                    ui.AddResources(resourcesLists);

                    if (!PlayniteTools.IsGameEmulated(_PlayniteApi, GameSelected))
                    {
                        // Load data
                        if (!PluginDatabase.IsLoaded)
                        {
                            return;
                        }
                        GameRequierements gameRequierements = PluginDatabase.Get(GameSelected);

                        SystemConfiguration systemConfiguration = PluginDatabase.Database.PC;


                        CheckMinimum     = new CheckSystem();
                        CheckRecommanded = new CheckSystem();
                        resourcesLists   = new List <ResourcesList>();
                        if (gameRequierements.GetMinimum().HasData)
                        {
                            CheckMinimum = SystemApi.CheckConfig(gameRequierements.GetMinimum(), systemConfiguration);
#if DEBUG
                            logger.Debug($"SystemChecker - CheckMinimum: {JsonConvert.SerializeObject(CheckMinimum)}");
#endif
                            resourcesLists.Add(new ResourcesList {
                                Key = "Scheck_HasData", Value = true
                            });
                            resourcesLists.Add(new ResourcesList {
                                Key = "Scheck_IsMinimumOK", Value = CheckMinimum.AllOk
                            });
                            resourcesLists.Add(new ResourcesList {
                                Key = "Scheck_IsAllOK", Value = CheckMinimum.AllOk
                            });
                        }
                        if (gameRequierements.GetRecommanded().HasData)
                        {
                            CheckRecommanded = SystemApi.CheckConfig(gameRequierements.GetRecommanded(), systemConfiguration);
#if DEBUG
                            logger.Debug($"SystemChecker - CheckRecommanded: {JsonConvert.SerializeObject(CheckRecommanded)}");
#endif
                            resourcesLists.Add(new ResourcesList {
                                Key = "Scheck_HasData", Value = true
                            });
                            resourcesLists.Add(new ResourcesList {
                                Key = "Scheck_IsRecommandedOK", Value = CheckRecommanded.AllOk
                            });
                            resourcesLists.Add(new ResourcesList {
                                Key = "Scheck_IsAllOK", Value = CheckRecommanded.AllOk
                            });
                        }

                        // If not cancel, show
                        if (!ct.IsCancellationRequested && GameSelected.Id == SystemChecker.GameSelected.Id)
                        {
                            ui.AddResources(resourcesLists);

                            if (_PlayniteApi.ApplicationInfo.Mode == ApplicationMode.Desktop)
                            {
                                PluginDatabase.SetCurrent(gameRequierements);
                            }
                        }
                    }
                    else
                    {
                        logger.Info($"SystemChecker - No treatment for emulated game");
                    }
                }
                catch (Exception ex)
                {
                    Common.LogError(ex, "SystemChecker", $"Error on TaskRefreshBtActionBar()");
                }
            }, ct);

            taskHelper.Add(TaskRefresh, tokenSource);
        }