/// <summary>
        /// 
        /// </summary>
        /// <param name="game"></param>
        /// <returns></returns>
        public List<MameGameRomDetails> FindMissingRoms(MameGame game)
        {
            var missing = new List<MameGameRomDetails>();

            foreach (var m in game)
            {
                var searchRomResults = SearchForRom(m.RomName, m.FileSize, m.CRC);

                if (searchRomResults.Count == 0)
                {
                    missing.Add(m);
                }
            }

            return missing;
        }
        public RomDetailsView(MameGame game)
        {
            InitializeComponent();
            _game = game;

            if (_game == null)
                return;

            _zipFileRepository = RepositoryManager.GetInstanceOf<IZipFileRepository>();
            _zipFileService = ServiceManager.GetInstanceOf<IZipFileService>();
            _settingsService = ServiceManager.GetInstanceOf<IMameMinerSettingsService>();

            this.GameNameTextBlock.Text = _game.GameName;
            this.GameDescriptionTextBlock.Text = _game.GameDescription;

            Task.Factory.StartNew(() =>
            {

                var hasDuplicates = _game.GroupBy(x => x.RomName).Any(g => g.Count() > 1);

                var sb = new StringBuilder();
                sb.AppendLine(string.Format("Report for : {0}.", game.GameDescription));
                sb.AppendLine(string.Format("Number of Players : {0}.", game.NumberOfPlayers));

                sb.AppendLine("==== Report on Game ====");
                sb.AppendLine(string.Format("Game Driver Status : {0}", game.GameState.ToString()));
                sb.AppendLine(string.Format("Bad Dump? : {0}", game.Any(g => g.BadDump)));
                sb.AppendLine(string.Format("Bad CRC? : {0}", game.Any(g => g.BadCRC)));
                sb.AppendLine(string.Format("Bad SHA1?: {0}", game.Any(g => g.BadSHA1)));

                if (game.Any(g => g.BadDump))
                {
                    sb.AppendLine("At least one rom in the collection is recognized as beeing a bad dump. You may not be able to run this game.");
                }

                if(game.GameState == GameWorkingStateEnum.Preliminary)
                {
                    sb.AppendLine("This game is ony preliminarily developed in Mame. Do not expect it to run.");

                }

                if (hasDuplicates)
                {
                    sb.AppendLine("At least one rom is a duplicate entry from listrom results. You may not be able to run this game.");
                }

                sb.AppendLine("==== Report on Roms ====");
                var missing = _zipFileRepository.FindMissingRoms(game);

                if (missing.Any())
                {
                    foreach (var m in missing)
                    {
                        sb.AppendLine(string.Format("Missing Rom with name of {0}", m.RomName, m.CRC));
                    }

                    sb.AppendLine("You may not be able to play a game generated with missing roms.");
                }
                else
                {
                    sb.AppendLine("No roms missing.");
                }

                Dispatcher.Invoke(() => GameDetailsTextBlock.Text = sb.ToString());

            });
        }
        /// <summary>
        /// 
        /// </summary>
        /// <param name="game"></param>
        /// <returns></returns>
        public bool HasMissingRoms(MameGame game)
        {
            foreach (var m in game)
            {
                var searchRomResults = SearchForRom(m.RomName);

                if (searchRomResults.Count == 0)
                {
                    return true;
                }
            }

            return false;
        }
        public IEnumerable<MameGame> SearchForGame(string searchTerm, List<int> numPlayers, List<GameWorkingStateEnum> gameStates, int maxResults)
        {
            if (_gameList == null)
            {
                var gList = _communicationService.ListFull().Split(new string[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries).ToList();
                gList.RemoveAt(0);

                _gameList = gList.ToArray();
            }

            foreach (var l in _gameList.Where(g => g.ToLower().Contains(searchTerm.ToLower())).Take(maxResults))
            {
                var entries = l.Split(new string[] { "  ", "   " }, StringSplitOptions.RemoveEmptyEntries);
                var gameName = entries[0].Trim();
                var gameDescription = entries[1].Trim().Replace("\"", "");

                var stateString = _communicationService.GetOverallState(gameName);
                GameWorkingStateEnum gameState = GameWorkingStateEnum.Good;

                if (stateString == "good") gameState = GameWorkingStateEnum.Good;
                if (stateString == "imperfect") gameState = GameWorkingStateEnum.Imperfect;
                if (stateString == "preliminary") gameState = GameWorkingStateEnum.Preliminary;

                var mameGame = new MameGame(gameName,
                    gameDescription,
                    _communicationService.ListRoms(gameName),
                    _communicationService.GetNumberPlayers(gameName),
                    gameState);

                if (numPlayers != null && numPlayers.Any() && !numPlayers.Contains(mameGame.NumberOfPlayers))
                    continue;

                if (gameStates != null && gameStates.Any() && !gameStates.Contains(mameGame.GameState))
                    continue;

                yield return mameGame;

            }
        }