/// <summary>
        /// Executes the transaction request to SagePay
        /// </summary>
        /// <param name="orderInfo"></param>
        /// <returns></returns>
        public PaymentRequest CreatePaymentRequest(OrderInfo orderInfo)
        {
            var paymentProvider = PaymentProvider.GetPaymentProvider(orderInfo.PaymentInfo.Id);

            var sagePayDirectIntegration = new SagePayDirectIntegration();

            var request = sagePayDirectIntegration.DirectPaymentRequest();

            SetRequestData(request, orderInfo);

            var result = sagePayDirectIntegration.ProcessDirectPaymentRequest(request, SagePaySettings.DirectPaymentUrl);

            if (result.Status == ResponseStatus.OK || (SagePaySettings.DefaultTransactionType == TransactionType.AUTHENTICATE && result.Status == ResponseStatus.REGISTERED))
            {
                orderInfo.PaymentInfo.Parameters = result.Status + "&" + result.StatusDetail;

                PaymentProviderHelper.SetTransactionId(orderInfo, result.VpsTxId);
                //Response.Redirect(string.Format("Result.aspx?vendorTxCode={0}", request.VendorTxCode));
            }
            else if (result.Status == ResponseStatus.THREEDAUTH)
            {
                // todo: not supported yet! code below is work in progress
                //var threeDSecureRequest = new PaymentRequest();

                //threeDSecureRequest.Parameters.Add("paReq", result.PaReq.Replace(" ", "+"));
                //threeDSecureRequest.Parameters.Add("acsUrl", result.AcsUrl);
                //threeDSecureRequest.Parameters.Add("md", result.Md);
                //threeDSecureRequest.Parameters.Add("vendorTxCode", request.VendorTxCode);

                //// Save Order with Order status in 3D Process
                //var threeDAuth = new NameValueCollection
                //{
                //	{"paReq", result.PaReq.Replace(" ", "+")},
                //	{"acsUrl", result.AcsUrl},
                //	{"md", result.Md},
                //	{"vendorTxCode", request.VendorTxCode}
                //};
                //if (HttpContext.Current.Session["USER_3DAUTH"] != null)
                //{
                //	HttpContext.Current.Session["USER_3DAUTH"] = null;
                //}
                //HttpContext.Current.Session.Add("USER_3DAUTH", threeDAuth);

                ////<form action="<%= ACSUrl %>" method="post">
                ////<input type="hidden" name="PaReq" value="<%= PaReq %>" />
                ////<input type="hidden" name="TermUrl" value="<%= TermUrl %>" />
                ////<input type="hidden" name="MD" value="<%= MD %>" />
                ////<input type="submit" value="Go" />
                ////</form>

                //var responseString = _requestSender.SendRequest(result.AcsUrl, threeDSecureRequest.ParametersAsString);


                //var threeDAuthRequest = sagePayDirectIntegration.ThreeDAuthRequest();
                //threeDAuthRequest.Md = Request.Form["MD"];
                //threeDAuthRequest.PaRes = Request.Form["PaRes"];
                //var directPaymentResult = sagePayDirectIntegration.ProcessDirect3D(threeDAuthRequest);

                //if (directPaymentResult.Status == ResponseStatus.OK)
                //{
                //	orderInfo.Paid = true;
                //	orderInfo.Status = OrderStatus.ReadyForDispatch;
                //}
                //else
                //{

                //	Log.Instance.LogError("SagePay Did not return a proper directPaymentResult status: " + directPaymentResult.StatusDetail);
                //	PaymentProviderHelper.AddValidationResult(orderInfo, orderInfo.PaymentInfo.Id, "SagePayReturnedError", directPaymentResult.StatusDetail);
                //}
            }
            else
            {
                Log.Instance.LogError("SagePay Did not return a proper status: " + result.StatusDetail);
                PaymentProviderHelper.AddValidationResult(orderInfo, orderInfo.PaymentInfo.Id, "SagePayReturnedError", result.StatusDetail);
            }


            orderInfo.Save();

            return(new PaymentRequest());
        }
        /// <summary>
        /// Executes the transaction request to SagePay
        /// </summary>
        /// <param name="orderInfo"></param>
        /// <returns></returns>
        public PaymentRequest CreatePaymentRequest(OrderInfo orderInfo)
        {
            var paymentProvider = PaymentProvider.GetPaymentProvider(orderInfo.PaymentInfo.Id);

            var sagePayDirectIntegration = new SagePayDirectIntegration();

            var request = sagePayDirectIntegration.DirectPaymentRequest();
            SetRequestData(request, orderInfo);

            var result = sagePayDirectIntegration.ProcessDirectPaymentRequest(request, SagePaySettings.DirectPaymentUrl);

            if (result.Status == ResponseStatus.OK || (SagePaySettings.DefaultTransactionType == TransactionType.AUTHENTICATE && result.Status == ResponseStatus.REGISTERED))
            {
                orderInfo.PaymentInfo.Parameters = result.Status + "&" + result.StatusDetail;

                PaymentProviderHelper.SetTransactionId(orderInfo, result.VpsTxId);
                //Response.Redirect(string.Format("Result.aspx?vendorTxCode={0}", request.VendorTxCode));
            }
            else if (result.Status == ResponseStatus.THREEDAUTH)
            {
                // todo: not supported yet! code below is work in progress
                //var threeDSecureRequest = new PaymentRequest();

                //threeDSecureRequest.Parameters.Add("paReq", result.PaReq.Replace(" ", "+"));
                //threeDSecureRequest.Parameters.Add("acsUrl", result.AcsUrl);
                //threeDSecureRequest.Parameters.Add("md", result.Md);
                //threeDSecureRequest.Parameters.Add("vendorTxCode", request.VendorTxCode);

                //// Save Order with Order status in 3D Process
                //var threeDAuth = new NameValueCollection
                //{
                //	{"paReq", result.PaReq.Replace(" ", "+")},
                //	{"acsUrl", result.AcsUrl},
                //	{"md", result.Md},
                //	{"vendorTxCode", request.VendorTxCode}
                //};
                //if (HttpContext.Current.Session["USER_3DAUTH"] != null)
                //{
                //	HttpContext.Current.Session["USER_3DAUTH"] = null;
                //}
                //HttpContext.Current.Session.Add("USER_3DAUTH", threeDAuth);

                ////<form action="<%= ACSUrl %>" method="post">
                ////<input type="hidden" name="PaReq" value="<%= PaReq %>" />
                ////<input type="hidden" name="TermUrl" value="<%= TermUrl %>" />
                ////<input type="hidden" name="MD" value="<%= MD %>" />
                ////<input type="submit" value="Go" />
                ////</form>

                //var responseString = _requestSender.SendRequest(result.AcsUrl, threeDSecureRequest.ParametersAsString);

                //var threeDAuthRequest = sagePayDirectIntegration.ThreeDAuthRequest();
                //threeDAuthRequest.Md = Request.Form["MD"];
                //threeDAuthRequest.PaRes = Request.Form["PaRes"];
                //var directPaymentResult = sagePayDirectIntegration.ProcessDirect3D(threeDAuthRequest);

                //if (directPaymentResult.Status == ResponseStatus.OK)
                //{
                //	orderInfo.Paid = true;
                //	orderInfo.Status = OrderStatus.ReadyForDispatch;
                //}
                //else
                //{

                //	Log.Instance.LogError("SagePay Did not return a proper directPaymentResult status: " + directPaymentResult.StatusDetail);
                //	PaymentProviderHelper.AddValidationResult(orderInfo, orderInfo.PaymentInfo.Id, "SagePayReturnedError", directPaymentResult.StatusDetail);
                //}

            }
            else
            {
                Log.Instance.LogError("SagePay Did not return a proper status: " + result.StatusDetail);
                PaymentProviderHelper.AddValidationResult(orderInfo, orderInfo.PaymentInfo.Id, "SagePayReturnedError", result.StatusDetail);

            }

            orderInfo.Save();

            return new PaymentRequest();
        }