private async Task <Result <bool> > ConfigureVideo(Action <UploaderProgress> progress, UploaderProgress upProgress, string uploadId, bool isDirectVideo, bool isDisappearingVideo, string caption,
                                                           VisualMediaViewMode viewMode, InstaStoryType storyType, string recipients, string threadId, Uri uri, StoryUploadOptions uploadOptions = null)
        {
            try
            {
                upProgress.UploadState = InstaUploadState.Configuring;
                progress?.Invoke(upProgress);
                var instaUri      = UriCreator.GetDirectConfigVideoUri();
                var retryContext  = GetRetryContext();
                var clientContext = Guid.NewGuid().ToString();

                if (isDirectVideo)
                {
                    var data = new Dictionary <string, string>
                    {
                        { "action", "send_item" },
                        { "client_context", clientContext },
                        { "_csrftoken", Session.CsrfToken },
                        { "video_result", "" },
                        { "_uuid", Device.Uuid.ToString() },
                        { "upload_id", uploadId }
                    };
                    if (!string.IsNullOrEmpty(recipients))
                    {
                        data.Add("recipient_users", $"[[{recipients}]]");
                    }
                    else
                    {
                        data.Add("thread_ids", $"[{threadId}]");
                    }

                    instaUri = UriCreator.GetDirectConfigVideoUri();
                    var request = new HttpRequestMessage(HttpMethod.Post, instaUri);
                    request.Content = new HttpFormUrlEncodedContent(data);
                    request.Headers.Add("retry_context", retryContext);
                    var response = await _httpClient.SendRequestAsync(request);

                    var json = await response.Content.ReadAsStringAsync();

                    DebugLogger.LogResponse(response);

                    if (response.StatusCode != HttpStatusCode.Ok)
                    {
                        upProgress.UploadState = InstaUploadState.Error;
                        progress?.Invoke(upProgress);
                        return(Result <bool> .Fail(json, response.ReasonPhrase));
                    }
                    var obj = JsonConvert.DeserializeObject <DefaultResponse>(json);

                    if (obj.Status.ToLower() == "ok")
                    {
                        upProgress.UploadState = InstaUploadState.Configured;
                        progress?.Invoke(upProgress);
                    }
                    else
                    {
                        upProgress.UploadState = InstaUploadState.Completed;
                        progress?.Invoke(upProgress);
                    }

                    return(obj.IsOk()
                        ? Result <bool> .Success(true, json, obj.Message)
                        : Result <bool> .Fail(json, obj.Message));
                }
                else
                {
                    var rnd  = new Random();
                    var data = new JObject
                    {
                        { "filter_type", "0" },
                        { "timezone_offset", "16200" },
                        { "_csrftoken", Session.CsrfToken },
                        { "client_shared_at", (DateTimeOffset.UtcNow.ToUnixTimeSeconds() - rnd.Next(25, 55)).ToString() },
                        { "story_media_creation_date", (DateTimeOffset.UtcNow.ToUnixTimeSeconds() - rnd.Next(50, 70)).ToString() },
                        { "media_folder", "Camera" },
                        { "source_type", "4" },
                        { "video_result", "" },
                        { "_uid", Session.LoggedInUser.Pk.ToString() },
                        { "_uuid", Device.Uuid.ToString() },
                        { "caption", caption ?? string.Empty },
                        { "date_time_original", DateTimeOffset.Now.ToString("yyyy-dd-MMTh:mm:ss-0fffZ") },
                        { "capture_type", "normal" },
                        { "mas_opt_in", "NOT_PROMPTED" },
                        { "upload_id", uploadId },
                        { "client_timestamp", DateTimeOffset.UtcNow.ToUnixTimeSeconds() },
                        {
                            "device", new JObject {
                                { "manufacturer", Device.HardwareManufacturer },
                                { "model", Device.HardwareModel },
                                { "android_release", Device.AndroidVersion.VersionNumber },
                                { "android_version", Device.AndroidVersion.APILevel }
                            }
                        },
                        { "length", 0 },
                        {
                            "extra", new JObject
                            {
                                { "source_width", 0 },
                                { "source_height", 0 }
                            }
                        },
                        { "audio_muted", false },
                        { "poster_frame_index", 0 },
                    };
                    if (isDisappearingVideo)
                    {
                        data.Add("view_mode", viewMode.ToString().ToLower());
                        data.Add("configure_mode", "2");
                        data.Add("recipient_users", "[]");
                        data.Add("thread_ids", $"[{threadId}]");
                    }
                    else
                    {
                        switch (storyType)
                        {
                        case InstaStoryType.SelfStory:
                        default:
                            data.Add("configure_mode", "1");
                            break;

                        case InstaStoryType.Direct:
                            data.Add("configure_mode", "2");
                            data.Add("view_mode", "replayable");
                            data.Add("recipient_users", "[]");
                            data.Add("thread_ids", $"[{threadId}]");
                            break;

                        case InstaStoryType.Both:
                            data.Add("configure_mode", "3");
                            data.Add("view_mode", "replayable");
                            data.Add("recipient_users", "[]");
                            data.Add("thread_ids", $"[{threadId}]");
                            break;
                        }

                        if (uri != null)
                        {
                            var webUri = new JArray
                            {
                                new JObject
                                {
                                    { "webUri", uri.ToString() }
                                }
                            };
                            var storyCta = new JArray
                            {
                                new JObject
                                {
                                    { "links", webUri }
                                }
                            };
                            data.Add("story_cta", storyCta.ToString(Formatting.None));
                        }

                        if (uploadOptions != null)
                        {
                            if (uploadOptions.Hashtags?.Count > 0)
                            {
                                var hashtagArr = new JArray();
                                foreach (var item in uploadOptions.Hashtags)
                                {
                                    hashtagArr.Add(item.ToJson());
                                }

                                data.Add("story_hashtags", hashtagArr.ToString(Formatting.None));
                            }

                            if (uploadOptions.Locations?.Count > 0)
                            {
                                var locationArr = new JArray();
                                foreach (var item in uploadOptions.Locations)
                                {
                                    locationArr.Add(item.ToJson());
                                }

                                data.Add("story_locations", locationArr.ToString(Formatting.None));
                            }
                            if (uploadOptions.Slider != null)
                            {
                                var sliderArr = new JArray
                                {
                                    uploadOptions.Slider.ToJson()
                                };

                                data.Add("story_sliders", sliderArr.ToString(Formatting.None));
                                if (uploadOptions.Slider.IsSticker)
                                {
                                    data.Add("story_sticker_ids", $"emoji_slider_{uploadOptions.Slider.Emoji}");
                                }
                            }
                            else
                            {
                                if (uploadOptions.Polls?.Count > 0)
                                {
                                    var pollArr = new JArray();
                                    foreach (var item in uploadOptions.Polls)
                                    {
                                        pollArr.Add(item.ToJson());
                                    }

                                    data.Add("story_polls", pollArr.ToString(Formatting.None));
                                }
                                if (uploadOptions.Questions?.Count > 0)
                                {
                                    var questionArr = new JArray();
                                    foreach (var item in uploadOptions.Questions)
                                    {
                                        questionArr.Add(item.ToJson());
                                    }

                                    data.Add("story_questions", questionArr.ToString(Formatting.None));
                                }
                            }
                            if (uploadOptions.Countdown != null)
                            {
                                var countdownArr = new JArray
                                {
                                    uploadOptions.Countdown.ToJson()
                                };

                                data.Add("story_countdowns", countdownArr.ToString(Formatting.None));
                                data.Add("story_sticker_ids", "countdown_sticker_time");
                            }
                        }
                    }
                    instaUri = UriCreator.GetVideoStoryConfigureUri(true);
                    var request = GetSignedRequest(instaUri, data);

                    request.Headers.Add("retry_context", retryContext);
                    var response = await _httpClient.SendRequestAsync(request);

                    var json = await response.Content.ReadAsStringAsync();

                    DebugLogger.LogResponse(response);

                    if (response.IsSuccessStatusCode)
                    {
                        var mediaResponse = JsonConvert.DeserializeObject <DefaultResponse>(json);

                        if (mediaResponse.IsOk())
                        {
                            upProgress.UploadState = InstaUploadState.Configured;
                            progress?.Invoke(upProgress);
                        }
                        else
                        {
                            upProgress.UploadState = InstaUploadState.Completed;
                            progress?.Invoke(upProgress);
                        }
                        return(mediaResponse.IsOk() ? Result <bool> .Success(true) : Result <bool> .Fail(json, mediaResponse.Message));
                    }
                    upProgress.UploadState = InstaUploadState.Error;
                    progress?.Invoke(upProgress);
                    return(Result <bool> .Fail(json, response.ReasonPhrase));
                }
            }
            catch (Exception exception)
            {
                upProgress.UploadState = InstaUploadState.Error;
                progress?.Invoke(upProgress);
                DebugLogger.LogException(exception);
                return(Result <bool> .Except(exception));
            }
        }