public async Task <Maybe <OpenCriticGame> > GetOpenCriticGame(int openCriticGameID)
        {
            try
            {
                var gameResponse = await _client.GetStringAsync($"game/{openCriticGameID}");

                if (string.IsNullOrWhiteSpace(gameResponse))
                {
                    return(Maybe <OpenCriticGame> .None);
                }
                JObject parsedGameResponse = JObject.Parse(gameResponse);

                var       gameName               = parsedGameResponse.GetValue("name").Value <string>();
                LocalDate?earliestReleaseDate    = null;
                var       releaseDateToken       = parsedGameResponse.GetValue("firstReleaseDate");
                var       firstReleaseDateString = releaseDateToken.Value <string>();
                if (!string.IsNullOrWhiteSpace(firstReleaseDateString))
                {
                    var earliestDateTime = releaseDateToken.Value <DateTime>();
                    earliestReleaseDate = LocalDate.FromDateTime(earliestDateTime);
                    if (earliestReleaseDate == DefaultOpenCriticReleaseDate)
                    {
                        earliestReleaseDate = null;
                    }
                }

                var score = parsedGameResponse.GetValue("topCriticScore").Value <decimal?>();
                if (score == -1m)
                {
                    score = parsedGameResponse.GetValue("averageScore").Value <decimal?>();
                    if (score != -1m)
                    {
                        _logger.LogWarning($"Using averageScore for game: {openCriticGameID}");
                    }
                    else
                    {
                        score = null;
                    }
                }

                var openCriticGame = new OpenCriticGame(openCriticGameID, gameName, score, earliestReleaseDate);
                return(openCriticGame);
            }
            catch (HttpRequestException httpEx)
            {
                if (httpEx.Message == "Response status code does not indicate success: 404 (Not Found).")
                {
                    return(Maybe <OpenCriticGame> .None);
                }
                _logger.LogError(httpEx, $"Getting an open critic game failed: {openCriticGameID}");
                throw;
            }
            catch (Exception e)
            {
                _logger.LogError(e, $"Getting an open critic game failed: {openCriticGameID}");
                throw;
            }
        }
        public async Task <Maybe <OpenCriticGame> > GetOpenCriticGame(int openCriticGameID)
        {
            try
            {
                var gameResponse = await _client.GetStringAsync($"/api/game?id={openCriticGameID}");

                JObject parsedGameResponse = JObject.Parse(gameResponse);

                List <LocalDate> releaseDates = new List <LocalDate>();
                var platforms = parsedGameResponse.GetValue("Platforms");
                foreach (var platform in platforms.Children())
                {
                    var gamePlatforms    = platform.SelectToken("GamesPlatforms");
                    var releaseDateToken = gamePlatforms.SelectToken("releaseDate");
                    if (releaseDateToken == null)
                    {
                        continue;
                    }

                    DateTime  releaseDateResult = releaseDateToken.Value <DateTime>();
                    LocalDate releaseDate       = LocalDate.FromDateTime(releaseDateResult);

                    releaseDates.Add(releaseDate);
                }

                LocalDate?earliestReleaseDate = releaseDates.Min();

                var scoreResponse = await _client.GetStringAsync($"/api/game/score?id={openCriticGameID}");

                var parsedResult = JsonConvert.DeserializeObject <OpenCriticScoreResponse>(scoreResponse);
                if (parsedResult == null)
                {
                    return(Maybe <OpenCriticGame> .None);
                }

                var openCriticGame = new OpenCriticGame(parsedResult, earliestReleaseDate);
                return(openCriticGame);
            }
            catch (HttpRequestException httpEx)
            {
                if (httpEx.Message == "Response status code does not indicate success: 404 (Not Found).")
                {
                    return(Maybe <OpenCriticGame> .None);
                }
                _logger.LogError(httpEx, $"Getting an open critic game failed: {openCriticGameID}");
                throw;
            }
            catch (Exception e)
            {
                _logger.LogError(e, $"Getting an open critic game failed: {openCriticGameID}");
                throw;
            }
        }