public async Task <IActionResult> Create(CreateFiatExchangeConversionViewModel viewModel)
        {
            var services = await GetServices();

            viewModel.BTCPayServices = new SelectList(services.btcPayServices, nameof(ExternalServiceData.Id),
                                                      nameof(ExternalServiceData.Name));
            viewModel.ExchangeServices = new SelectList(services.exchangeServices, nameof(ExternalServiceData.Id),
                                                        nameof(ExternalServiceData.Name));

            if (viewModel.Action.Equals("add-item", StringComparison.InvariantCultureIgnoreCase))
            {
                viewModel.Conditions.Add(new CreateFiatExchangeConversionViewModel.ConversionConditionItem());
                return(View(viewModel));
            }

            if (viewModel.Action.StartsWith("remove-item", StringComparison.InvariantCultureIgnoreCase))
            {
                var index = int.Parse(viewModel.Action.Substring(viewModel.Action.IndexOf(":") + 1));
                viewModel.Conditions.RemoveAt(index);
                return(View(viewModel));
            }

            if (!viewModel.Conditions.Any())
            {
                ModelState.AddModelError(nameof(viewModel.Conditions), "You need to add at least one conversion scenario!");
            }
            if (ModelState.IsValid)
            {
                for (var index = 0; index < viewModel.Conditions.Count; index++)
                {
                    var condition   = viewModel.Conditions[index];
                    var serviceData =
                        await _externalServiceManager.GetExternalServiceData(condition.ExchangeServiceId, GetUserId());

                    var exchangeService = new ExchangeService(serviceData);
                    var symbols         = (await exchangeService.ConstructClient().GetMarketSymbolsAsync()).ToArray();
                    if (!symbols.Contains(condition.MarketSymbol))
                    {
                        viewModel.AddModelError(
                            $"{nameof(viewModel.Conditions)}[{index}].{nameof(CreateFiatExchangeConversionViewModel.ConversionConditionItem.MarketSymbol)}",
                            $"The market symbols you entered is invalid. Please choose from the following: {string.Join(",", symbols)}", ModelState);
                    }
                }
            }
            if (!ModelState.IsValid)
            {
                return(View(viewModel));
            }

            return(await SetItUp(viewModel));
        }
        private async Task <IActionResult> SetItUp(CreateFiatExchangeConversionViewModel vm)
        {
            var presetName = $"Generated_FiatExchangeConversion";

            var recipe = new Recipe()
            {
                Name        = presetName,
                Description = "Generated from a preset",
                UserId      = _userManager.GetUserId(User),
                Enabled     = false
            };
            await _recipeManager.AddOrUpdateRecipe(recipe);

            var recipeTrigger = new RecipeTrigger()
            {
                ExternalServiceId = vm.SelectedBTCPayExternalServiceId,
                TriggerId         = new InvoiceStatusChangedTrigger().Id,
                RecipeId          = recipe.Id
            };

            recipeTrigger.Set(new InvoiceStatusChangedTriggerParameters()
            {
                Conditions = new List <InvoiceStatusChangeCondition>()
                {
                    new InvoiceStatusChangeCondition()
                    {
                        Status            = vm.Status,
                        ExceptionStatuses = InvoiceStatusChangedController.AllowedExceptionStatus.Select(item => item.Value).ToList()
                    }
                }
            });
            await _recipeManager.AddOrUpdateRecipeTrigger(recipeTrigger);

            var recipeActionGroup = new RecipeActionGroup()
            {
                RecipeId = recipe.Id
            };

            foreach (var condition in vm.Conditions)
            {
                await _recipeManager.AddRecipeActionGroup(recipeActionGroup);

                var recipeActionGroupIndex = 0;
                var getPayments            = new RecipeAction()
                {
                    RecipeId            = recipe.Id,
                    RecipeActionGroupId = recipeActionGroup.Id,
                    ActionId            = new GetPaymentsFromInvoiceDataActionHandler().ActionId,
                    ExternalServiceId   = vm.SelectedBTCPayExternalServiceId,
                    Order    = recipeActionGroupIndex,
                    DataJson = JsonConvert.SerializeObject(new GetPaymentsFromInvoiceData()
                    {
                        CryptoCode  = condition.CryptoCode,
                        InvoiceId   = "{{TriggerData.Invoice.Id}}",
                        PaymentType = ""
                    })
                };
                recipeActionGroupIndex++;
                await _recipeManager.AddOrUpdateRecipeAction(getPayments);

                var tradeAction = new RecipeAction()
                {
                    RecipeId            = recipe.Id,
                    RecipeActionGroupId = recipeActionGroup.Id,
                    ActionId            = new PlaceOrderDataActionHandler().ActionId,
                    ExternalServiceId   = condition.ExchangeServiceId,
                    Order    = recipeActionGroupIndex,
                    DataJson = JsonConvert.SerializeObject(new PlaceOrderData()
                    {
                        Amount       = "{{PreviousAction.Sum(" + nameof(InvoicePaymentInfo.Value) + ")}}",
                        IsBuy        = condition.IsBuy,
                        MarketSymbol = condition.MarketSymbol,
                        OrderType    = OrderType.Market
                    })
                };

                recipeActionGroupIndex++;
                await _recipeManager.AddOrUpdateRecipeAction(tradeAction);
            }

            return(RedirectToAction("EditRecipe", "Recipes", new
            {
                id = recipe.Id,
                statusMessage =
                    "Preset generated. Recipe is currently disabled for now. Please verify details are correct before enabling!"
            }));
        }