/// <summary>Make a call to <see cref="TraktOAuthModule.GetOAuthTokenAsync()"/> to get an OAuth access token using <see cref="AuthorizationCode"/>, <see cref="ClientId"/>,
        /// <see cref="ClientSecret"/> and <see cref="OAuthRedirectUri"/>, and parse the result into <see cref="CurrentOAuthAccessToken"/></summary>
        /// <returns><see cref="CurrentOAuthAccessToken"/></returns>
        public async Task <TraktOAuthAccessToken> GetOAuthAccessToken()
        {
            AuthenticationMode = TraktAuthenticationMode.OAuth;
            var result = await Client.OAuth.GetOAuthTokenAsync(AuthorizationCode, ClientId, ClientSecret, OAuthRedirectUri, TraktOAuthTokenGrantType.AuthorizationCode);

            CurrentOAuthAccessToken = new TraktOAuthAccessToken {
                AccessToken        = result.AccessToken,
                AccessTokenExpires = DateTime.Now.AddSeconds(result.ExpiresIn),
                AccessScope        = result.Scope
            };
            return(CurrentOAuthAccessToken);
        }
        /// <summary>Make a call to <see cref="TraktOAuthModule.GetOAuthTokenAsync()"/> to refresh an OAuth access token using <see cref="AuthorizationCode"/>, <see cref="ClientId"/>,
        /// <see cref="ClientSecret"/> and <see cref="OAuthRedirectUri"/>, and parse the result into <see cref="CurrentOAuthAccessToken"/></summary>
        /// <returns><see cref="CurrentOAuthAccessToken"/></returns>
        public async Task <TraktOAuthAccessToken> RefreshOAuthAccessToken()
        {
            //TODO: OAuth refresh currently not working - it isn't clear from the docs exactly what values should be passed in. Reported to Trakt staff.
            AuthenticationMode = TraktAuthenticationMode.OAuth;
            var result = await Client.OAuth.GetOAuthTokenAsync(CurrentOAuthAccessToken.RefreshToken, ClientId, ClientSecret, OAuthRedirectUri, TraktOAuthTokenGrantType.RefreshToken);

            CurrentOAuthAccessToken = new TraktOAuthAccessToken {
                AccessToken        = result.AccessToken,
                AccessTokenExpires = DateTime.Now.AddSeconds(result.ExpiresIn),
                AccessScope        = result.Scope,
                RefreshToken       = result.RefreshToken
            };
            return(CurrentOAuthAccessToken);
        }
        /// <summary>
        /// Saves the OAuth access token.
        /// </summary>
        /// <param name="token">The OAuth access token returned from the server.</param>
        private void SaveAuthToken(TraktOAuthAccessToken token)
        {
            OAuth auth = schedulerDb.OAuth.FirstOrDefault();
            if (auth == null)
            {
                auth = new OAuth();
                schedulerDb.OAuth.Add(auth);
            }

            auth.AuthToken = token.AccessToken;
            auth.RefreshToken = token.RefreshToken;
            auth.Expires = token.AccessTokenExpires;
            auth.Scope = token.AccessScope;

            schedulerDb.SaveChanges();

            AuthenticationNeeded = !token.IsValid;
        }