private void UpdateStatistics(AudioFileOption option)
        {
            if (option.AccuracyScore > _BestAccuracyScore)
            {
                _BestAccuracyScore = option.AccuracyScore;
            }

            if (option.GetTotalPoints() > _BestTotalPoints)
            {
                _BestTotalPoints = option.GetTotalPoints();
            }

            if (option.ArtistAlbumPoints > _BestArtistAlbumPoints)
            {
                _BestArtistAlbumPoints = option.ArtistAlbumPoints;
            }

            if (option.TrackPoints > _BestTrackPoints)
            {
                _BestTrackPoints = option.TrackPoints;
            }
        }
        public void AddAudioFileOption(AudioFileOption newOption)
        {
            //If less than minimum search filter size, add to it and return
            if (_AudioFileOptions.Count < Globals.MinimumSearchFilterSize)
            {
                _AudioFileOptions.Add(newOption);

                _AudioFileOptions = _AudioFileOptions.OrderByDescending(option => option.GetTotalPoints()).ToList();

                UpdateStatistics(newOption);

                return;
            }

            int newOptionTotalPoints = newOption.GetTotalPoints();
            int lowestTotalPoints    = _AudioFileOptions.Last().GetTotalPoints();

            //The search filter is full, so only add if the option scores equal or better than the worst option
            if (newOptionTotalPoints >= lowestTotalPoints)
            {
                _AudioFileOptions.Add(newOption);             //add new option to end of list

                if (newOptionTotalPoints > lowestTotalPoints) //the list needs to be sorted again
                {
                    _AudioFileOptions = _AudioFileOptions.OrderByDescending(option => option.GetTotalPoints()).ToList();

                    int lowestPointsToKeep = _AudioFileOptions[Globals.MinimumSearchFilterSize - 1].GetTotalPoints();

                    if (lowestPointsToKeep > lowestTotalPoints)  //we need to trim out the worst options
                    {
                        _AudioFileOptions = _AudioFileOptions.Where(option => option.GetTotalPoints() >= lowestPointsToKeep).ToList();

                        RefreshStatistics();  //Full refresh of stats
                    }
                    else
                    {
                        UpdateStatistics(newOption);  //No options were removed, so just update the stats with the new option added
                    }
                }
                else
                {
                    UpdateStatistics(newOption);  //No options were removed, so just update the stats with the new option added
                }
            }
        }
        private static int ChooseBestCandidateOption(AudioFileOption candidateOption_1, AudioFileOption candidateOption_2)
        {
            if (candidateOption_1.AccuracyScore >= candidateOption_2.AccuracyScore && candidateOption_1.GetTotalPoints() >= candidateOption_2.GetTotalPoints())
            {
                if (candidateOption_1.ArtistAlbumPoints > 0 && candidateOption_1.TrackPoints > 0)
                {
                    return(1);
                }
            }

            if (candidateOption_2.AccuracyScore >= candidateOption_1.AccuracyScore && candidateOption_2.GetTotalPoints() >= candidateOption_1.GetTotalPoints())
            {
                if (candidateOption_2.ArtistAlbumPoints > 0 && candidateOption_2.TrackPoints > 0)
                {
                    return(2);
                }
            }

            if (candidateOption_1.AccuracyScore >= candidateOption_2.AccuracyScore && candidateOption_1.GetTotalPoints() >= candidateOption_2.GetTotalPoints())
            {
                return(1);
            }

            if (candidateOption_2.AccuracyScore >= candidateOption_1.AccuracyScore && candidateOption_2.GetTotalPoints() >= candidateOption_1.GetTotalPoints())
            {
                return(2);
            }

            //Candidate options have opposing accuracy scores and total points
            int accuracyScoreDiff = Math.Abs(candidateOption_1.AccuracyScore - candidateOption_2.AccuracyScore);

            int totalPointsDiff = Math.Abs(candidateOption_1.GetTotalPoints() - candidateOption_2.GetTotalPoints());

            if (accuracyScoreDiff >= totalPointsDiff) //Better to go with higher accuracy score
            {
                if (candidateOption_1.AccuracyScore >= candidateOption_2.AccuracyScore)
                {
                    if (candidateOption_1.ArtistAlbumPoints > 0 && candidateOption_1.TrackPoints > 0)
                    {
                        return(1);
                    }
                    else if (candidateOption_2.ArtistAlbumPoints > 0 && candidateOption_2.TrackPoints > 0)
                    {
                        return(2);
                    }
                    else
                    {
                        return(1);
                    }
                }
                else
                {
                    if (candidateOption_2.ArtistAlbumPoints > 0 && candidateOption_2.TrackPoints > 0)
                    {
                        return(2);
                    }
                    else if (candidateOption_1.ArtistAlbumPoints > 0 && candidateOption_1.TrackPoints > 0)
                    {
                        return(1);
                    }
                    else
                    {
                        return(2);
                    }
                }
            }
            else  //better to go with more total points
            {
                if (candidateOption_1.GetTotalPoints() >= candidateOption_2.GetTotalPoints())
                {
                    if (candidateOption_1.ArtistAlbumPoints > 0 && candidateOption_1.TrackPoints > 0)
                    {
                        return(1);
                    }
                    else if (candidateOption_2.ArtistAlbumPoints > 0 && candidateOption_2.TrackPoints > 0)
                    {
                        return(2);
                    }
                    else
                    {
                        return(1);
                    }
                }
                else
                {
                    if (candidateOption_2.ArtistAlbumPoints > 0 && candidateOption_2.TrackPoints > 0)
                    {
                        return(2);
                    }
                    else if (candidateOption_1.ArtistAlbumPoints > 0 && candidateOption_1.TrackPoints > 0)
                    {
                        return(1);
                    }
                    else
                    {
                        return(2);
                    }
                }
            }
        }