public Uri CreatePaymentRequest(string emailId, double amount, string redirectUrl)
        {
            if (_server == null)
            {
                InitiateConnection();
            }
            this.emailId = emailId;
            UserModel developer_model = new UserModel();

            try
            {
                if (amount < 10)
                {
                    throw new Exception("amount too low, it must be atleast Rs 10");
                }
            }
            catch (Exception e)
            {
                Console.WriteLine(e);
                throw new Exception(e.Message);
            }
            try
            {
                var collection = _kitsuneDB.GetCollection <BsonDocument>("users");
                var filter     = Builders <BsonDocument> .Filter.Eq("Email", emailId);

                if (collection.Find(filter).Count() != 1)
                {
                    throw new Exception("dev_id doesn't exist");
                }
                BsonDocument doc = collection.Find(filter).First();
                developer_model = BsonSerializer.Deserialize <UserModel>(doc);
            }
            catch (Exception e)
            {
                Console.WriteLine(e);
                throw new Exception("Unable to fetch user details");
            }

            string payment_url = null;

            string         url     = EnvConstants.Constants.InstaMojoAPIUrl;
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);

            request.Method = "POST";
            request.Headers["X-Api-Key"]    = API_KEY;
            request.Headers["X-Auth-Token"] = AUTH_TOKEN;
            request.ContentType             = "application/x-www-form-urlencoded";
            string postData = $"amount={amount.ToString()}" +
                              $"&purpose=Kitsune Recharge" +
                              $"&buyer_name={developer_model.DisplayName}" +
                              $"&email={developer_model.Email}" +
                              $"&send_email=True" +
                              $"&redirect_url={redirectUrl}" +
                              $"&webhook={EnvConstants.Constants.InstamojoWebhook}";

            if (developer_model.PhoneNumber != null && developer_model.PhoneNumber.Length != 0)
            {
                postData += $"&phone={developer_model.PhoneNumber}";
            }
            byte[] bytes = Encoding.UTF8.GetBytes(postData);
            request.ContentLength = bytes.Length;
            //try
            //{
            //    if (developer_model.PhoneNumber == null || developer_model.PhoneNumber.Length == 0)
            //    {
            //        throw new Exception("Phone number cannot be empty");
            //    }
            //    else
            //    {
            //        request.AddParameter("phone", developer_model.PhoneNumber);
            //    }
            //}
            //catch (Exception e)
            //{
            //    throw new Exception(e.Message);
            //}


            #region Payment request to get the URL
            try
            {
                Stream requestStream = request.GetRequestStream();
                requestStream.Write(bytes, 0, bytes.Length);

                WebResponse  response = request.GetResponse();
                Stream       stream   = response.GetResponseStream();
                StreamReader reader   = new StreamReader(stream);

                var     result       = reader.ReadToEnd();
                JObject responseJson = JObject.Parse(result);

                InstamojoPaymentStatusModel responseModel = new InstamojoPaymentStatusModel();
                try
                {
                    responseModel = JsonConvert.DeserializeObject <InstamojoPaymentStatusModel>(responseJson.ToString());
                    if (responseModel.success == true)
                    {
                        payment_url = responseModel.payment_request.longurl;

                        PaymentTransactionLog paymentTransactionLog = new PaymentTransactionLog()
                        {
                            _id = ObjectId.GenerateNewId().ToString(),
                            PaymentRequestId = responseModel.payment_request.id,
                            Status           = null,
                            Amount           = responseModel.payment_request.amount,
                            UserProfileId    = emailId,
                            InvoiceId        = "KINV-" + GenerateInvoiceId(),
                            CreatedOn        = DateTime.Now,
                            UpdatedOn        = DateTime.Now
                        };

                        var json       = JsonConvert.SerializeObject(paymentTransactionLog);
                        var document   = MongoDB.Bson.Serialization.BsonSerializer.Deserialize <BsonDocument>(json);
                        var collection = _kitsuneDB.GetCollection <BsonDocument>("PaymentTransactionLogs");
                        collection.InsertOneAsync(document).Wait();

                        InstamojoTransactionLog instamojoTransactionLog = new InstamojoTransactionLog()
                        {
                            _id = ObjectId.GenerateNewId().ToString(),
                            payment_request_id = responseModel.payment_request.id,
                            longurl            = responseModel.payment_request.longurl,
                            buyer       = responseModel.payment_request.buyer_name,
                            buyer_name  = responseModel.payment_request.buyer_name,
                            buyer_phone = responseModel.payment_request.phone,
                            purpose     = responseModel.payment_request.purpose,
                            amount      = responseModel.payment_request.amount.ToString(),
                            shorturl    = responseModel.payment_request.shorturl,
                            currency    = null,
                            status      = null,
                            fees        = null,
                            mac         = null,
                            payment_id  = null
                        };

                        var collection2 = _kitsuneDB.GetCollection <InstamojoTransactionLog>("InstamojoTransactionLogs");
                        collection2.InsertOneAsync(instamojoTransactionLog).Wait();
                    }
                    else
                    {
                        //Error
                        throw new Exception("error : " + responseModel.payment_request);
                    }
                }
                catch (Exception e)
                {
                    //CRITICAL ERROR : FAILED TO GET PAYMENT REQUEST
                    throw new Exception("CRITICAL ERROR " + e.Message);
                }
            }
            catch (Exception e)
            {
                //CONNECTION FAILED
                throw new Exception("Error while sending payment Url :" + e.Message);
            }
            #endregion
            try
            {
                Uri uri = new Uri(payment_url);
                return(uri);
            }
            catch (Exception ex)
            {
                throw new Exception("Error While creating Uri from url: " + payment_url);
            }
        }
        public void UpdateRequestStatus(Stream data)
        {
            #region ConvertToKitsuneWebhook
            try
            {
                #region deserialize web hook data
                StreamReader reader = new StreamReader(data);
                var          dict   = HttpUtility.ParseQueryString(reader.ReadToEnd());
                var          json   = JsonConvert.SerializeObject(dict.Keys.Cast <string>()
                                                                  .ToDictionary(k => k, k => dict[k]), Formatting.Indented);
                var instaMojoHookResponse = JsonConvert.DeserializeObject <InstamojoWebhookResponseModel>(json);
                #endregion

                #region GetPaymentRequestAgain

                string         url     = EnvConstants.Constants.InstaMojoAPIUrl + instaMojoHookResponse.payment_request_id + "/" + instaMojoHookResponse.payment_id;
                HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
                request.Method = "POST";
                request.Headers["X-Api-Key"]    = API_KEY;
                request.Headers["X-Auth-Token"] = AUTH_TOKEN;

                WebResponse  response = request.GetResponse();
                Stream       stream   = response.GetResponseStream();
                StreamReader reader1  = new StreamReader(stream);

                var     result = reader1.ReadToEnd();
                JObject paymentResponseJson = JObject.Parse(result);

                #endregion

                IMongoClient mongoClient = new MongoClient(connectionString);
                // change db name
                IMongoDatabase eDB = mongoClient.GetDatabase(EnvConstants.Constants.ConvertToKitsuneDatabaseName);
                // get colleciton name dynamically
                var collection = eDB.GetCollection <BsonDocument>("PaymentDetails");
                FilterDefinition <BsonDocument> filter;
                if (!String.IsNullOrEmpty(instaMojoHookResponse.payment_request_id))
                {
                    filter = Builders <BsonDocument> .Filter.Eq("payment_request.id", instaMojoHookResponse.payment_request_id);
                }
                else
                {
                    return;
                }
                InstamojoPaymentStatusModel paymentStatusModel = new InstamojoPaymentStatusModel();
                paymentStatusModel = JsonConvert.DeserializeObject <InstamojoPaymentStatusModel>(paymentResponseJson.ToString());

                if (paymentStatusModel.success)
                {
                    try
                    {
                        //call wallet api to add funds
                        string walletApiUrl = EnvConstants.Constants.WalletUpdateUrl + "?useremail=" + paymentStatusModel.payment_request.email + "&amount=" + instaMojoHookResponse.amount + "&add=true";
                        request        = (HttpWebRequest)WebRequest.Create(url);
                        request.Method = "POST";
                        request.Headers["X-Api-Key"]    = API_KEY;
                        request.Headers["X-Auth-Token"] = AUTH_TOKEN;

                        var walletResponse = (HttpWebResponse)request.GetResponse();

                        if (walletResponse.StatusCode != HttpStatusCode.OK)
                        {
                            throw new Exception("Wallet update failed with status code : " + walletResponse.StatusCode);
                        }
                    }
                    catch (Exception ex)
                    {
                    }
                }

                var InstamojoPaymentRequestJson = JsonConvert.SerializeObject(paymentStatusModel.payment_request);
                var paymentDetailsDocument      = MongoDB.Bson.Serialization.BsonSerializer.Deserialize <BsonDocument>(InstamojoPaymentRequestJson);
                try
                {
                    //insert payment details
                    collection.InsertOne(paymentDetailsDocument);
                }
                catch (Exception e)
                {
                    //CRITICAL ERROR, FAILED TO UPDATE DOCUMENT
                    //Console.WriteLine(e);
                }
                #endregion
                //Console.WriteLine("done");
            }
            catch (Exception e)
            {
                //CATCHES CONNECTION,DATABASE LOGIN EXCEPTIONS
                //Console.WriteLine(e);
            }
        }