/// <summary>
        /// handle what quality as an asynchronous operation.
        /// </summary>
        /// <param name="stepContext">The step context.</param>
        /// <param name="cancellationToken">The cancellation token.</param>
        /// <returns>Task&lt;DialogTurnResult&gt;.</returns>
        private async Task <DialogTurnResult> HandleWhatQualityAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken)
        {
            var userProfile = await Accessors.GetAsync(stepContext.Context, () => new UserProfile(), cancellationToken);

            userProfile.MovieDownload.Quality    = stepContext.GetEnumValueFromChoice <MovieQuality>();
            userProfile.MovieDownload.QualitySet = true;

            return(await stepContext.ReplaceDialogAsync(SearchWaterfall, cancellationToken : cancellationToken));
        }
        /// <summary>
        /// Handles the result of the initial step.
        /// </summary>
        /// <param name="stepContext">The step context.</param>
        /// <param name="cancellationToken">The cancellation token.</param>
        /// <returns>Task&lt;DialogTurnResult&gt;.</returns>
        private async Task <DialogTurnResult> HandleInitialStepAsnc(WaterfallStepContext stepContext, CancellationToken cancellationToken)
        {
            // Get the current profile object from user state.
            var userProfile = await Accessors.GetAsync(stepContext.Context, () => new UserProfile(), cancellationToken);

            userProfile.MainAction = stepContext.GetEnumValueFromChoice <InitialOptions>();;

            switch (userProfile.MainAction)
            {
            case InitialOptions.DownloadSomething:
                return(await stepContext.BeginDialogAsync(DialogNames.DownloadDialog, null, cancellationToken));

            default:
                return(await stepContext.EndDialogAsync(cancellationToken : cancellationToken));
            }
        }
        /// <summary>
        /// Handles the type of the download.
        /// </summary>
        /// <param name="stepContext">The step context.</param>
        /// <param name="cancellationToken">The cancellation token.</param>
        /// <returns>Task&lt;DialogTurnResult&gt;.</returns>
        private async Task <DialogTurnResult> HandleDownloadTypeAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken)
        {
            // Get the current profile object from user state.
            var userProfile = await Accessors.GetAsync(stepContext.Context, () => new UserProfile(), cancellationToken);

            userProfile.DownloadType = stepContext.GetEnumValueFromChoice <DownloadType>();

            switch (userProfile.DownloadType)
            {
            case DownloadType.Tv:
                return(await stepContext.BeginDialogAsync(DialogNames.TvDownload, null, cancellationToken));

            case DownloadType.Movie:
                return(await stepContext.BeginDialogAsync(DialogNames.MovieDownload, null, cancellationToken));

            default:
                return(await stepContext.EndDialogAsync(cancellationToken : cancellationToken));
            }
        }