public async Task <IActionResult> GetMeterInfoAsync([FromBody] MeterInfoModel model)
        {
            string vendor_code       = _configuration["Irecharge:VendorCode"];
            string pubkey            = _configuration["Irecharge:PublicKey"];
            string privKey           = _configuration["Irecharge:PrivateKey"];
            string baseUri_MeterInfo = _configuration["Irecharge:MeterInfoURL"];

            if (!ModelState.IsValid)
            {
                return(BadRequest("Invalid parameters"));
            }

            //get user details
            var username = HttpContext.User.Identity.Name;
            var user     = _userManager.FindByEmailAsync(username).Result;

            if (user.MainBalance <= Convert.ToDecimal(model.Amount))
            {
                return(Ok("Insufficient Balance"));
            }

            string meter_number = model.MeterNumber;
            //string disco = transaction.Service.Name;
            string disco;
            int    serviceId = 0;

            if (model.Service == "KAEDC_Prepaid")
            {
                disco     = "Kaduna_Electricity_Disco";
                serviceId = 1;
            }
            else if (model.Service == "KAEDC_Postpaid")
            {
                disco     = "Kaduna_Electricity_Disco_Postpaid";
                serviceId = 2;
            }
            else
            {
                return(BadRequest("Invalid Service"));
            }

            string ref_id         = ExtraMethods.GenerateRandomNumber();
            string combinedstring = vendor_code + "|" + ref_id + "|" + meter_number + "|" + disco + "|" + pubkey;

            byte[] key  = Encoding.ASCII.GetBytes(privKey);
            string hash = ExtraMethods.GenerateHash(combinedstring, key);


            WebClient webClient = new WebClient();

            webClient.QueryString.Add("vendor_code", vendor_code);
            webClient.QueryString.Add("meter", meter_number);
            webClient.QueryString.Add("reference_id", ref_id);
            webClient.QueryString.Add("disco", disco);
            webClient.QueryString.Add("response_format", "json");
            webClient.QueryString.Add("hash", hash);

            try
            {
                string response = webClient.DownloadString(baseUri_MeterInfo);

                var jsonresult  = JsonConvert.DeserializeObject <iRechargeMeterInfo>(response);
                var transaction = new Transaction();

                transaction.Id                   = ExtraMethods.GenerateId();
                transaction.PayerIp              = ExtraMethods.GetLocalIPAddress();
                transaction.PaymentMethodId      = 1;
                transaction.MeterName            = jsonresult.customer.name;
                transaction.Statuscode           = Convert.ToInt32(jsonresult.status);
                transaction.StatusMessage        = jsonresult.message;
                transaction.ApiUniqueReference   = ref_id;
                transaction.Service              = _db.Service.Where(s => s.Id == serviceId).FirstOrDefault();
                transaction.PhcnUnique           = jsonresult.access_token;
                transaction.Hash                 = hash;
                transaction.transactionsStatus   = "initiated";
                transaction.Datetime             = DateTime.Now;
                transaction.KaedcUserNavigation  = user;
                transaction.KaedcUser            = user.Id;
                transaction.Amount               = model.Amount + 100;
                transaction.PayersName           = user.Surname + " " + user.Firstname;
                transaction.Meternumber          = meter_number;
                transaction.RecipientPhoneNumber = model.PhoneNumber;

                _db.Transaction.Add(transaction);
                await _db.SaveChangesAsync();

                return(Ok(new {
                    ID = transaction.Id,
                    SERVICE = transaction.Service.Name,
                    AMOUNT = transaction.Amount,
                    METERNUMBER = transaction.Meternumber,
                    METERNAME = transaction.MeterName,
                    PAYER = transaction.PayersName,
                    PHONENUMBER = transaction.RecipientPhoneNumber,
                    STATUS = transaction.transactionsStatus,
                    DATE = transaction.Datetime
                }));
            }
            catch (WebException ex)
            {
                if (ex.Status == WebExceptionStatus.ProtocolError && ex.Response != null)
                {
                    var resp = (HttpWebResponse)ex.Response;
                    if (resp.StatusCode == HttpStatusCode.NotFound) // HTTP 404
                    {
                        return(Ok("Unable to retrieve meter details"));
                    }
                }
                throw;
            }
        }
        public async Task <IActionResult> VendMeter(int id, VendModel model)
        {
            //var transaction = db.Transaction.Where(t => t.Id == id).FirstOrDefault();
            string vendor_code       = _configuration["Irecharge:VendorCode"];
            string pubkey            = _configuration["Irecharge:PublicKey"];
            string privKey           = _configuration["Irecharge:PrivateKey"];
            string baseUri_VendPower = _configuration["Irecharge:VendPowerURL"];

            if (model.TransactionId != id)
            {
                return(BadRequest("Invalid Transaction"));
            }

            //get existing data from DB
            var transact = _db.Transaction.Where(t => t.Id == model.TransactionId).FirstOrDefault();

            //get user details
            var username = HttpContext.User.Identity.Name;
            var user     = _userManager.FindByEmailAsync(username).Result;

            if (user.MainBalance <= Convert.ToDecimal(transact.Amount))
            {
                return(Ok("Insufficient Balance"));
            }


            string disco;
            int    serviceId = 0;

            if (model.Service == "KAEDC_Prepaid")
            {
                disco     = "Kaduna_Electricity_Disco";
                serviceId = 1;
            }
            else if (model.Service == "KAEDC_Postpaid")
            {
                disco     = "Kaduna_Electricity_Disco_Postpaid";
                serviceId = 2;
            }
            else
            {
                return(BadRequest("Invalid Service"));
            }

            string meter_number = transact.Meternumber;
            string ref_id       = transact.ApiUniqueReference;
            string access_token = transact.PhcnUnique;
            string amount       = Convert.ToString(transact.Amount);
            string phone        = transact.RecipientPhoneNumber;
            string email        = user.Email;

            string combinedstring = vendor_code + "|" + ref_id + "|" + meter_number + "|" + disco + "|" + amount + "|" + access_token + "|" + pubkey;

            byte[] key  = Encoding.ASCII.GetBytes(privKey);
            string hash = ExtraMethods.GenerateHash(combinedstring, key);

            try
            {
                WebClient webClient = new WebClient();
                webClient.QueryString.Add("vendor_code", vendor_code);
                webClient.QueryString.Add("meter", meter_number);
                webClient.QueryString.Add("reference_id", ref_id);
                webClient.QueryString.Add("response_format", "json");
                webClient.QueryString.Add("disco", disco);
                webClient.QueryString.Add("access_token", access_token);
                webClient.QueryString.Add("amount", amount);
                webClient.QueryString.Add("phone", phone);
                webClient.QueryString.Add("email", email);
                webClient.QueryString.Add("hash", hash);

                string response = webClient.DownloadString(baseUri_VendPower);

                var jsonresult = JsonConvert.DeserializeObject <iRechargeVendPower>(response);

                transact.PayerIp                = ExtraMethods.GetLocalIPAddress();
                transact.PaymentMethodId        = 1;
                transact.Statuscode             = Convert.ToInt32(jsonresult.status);
                transact.StatusMessage          = jsonresult.message;
                transact.ApiUniqueReference     = ref_id;
                transact.GatewayresponseMessage = response;
                transact.Token       = jsonresult.meter_token;
                transact.BrinqProfit = ExtraMethods.BrinqProfit(model.Amount, serviceId);
                transact.TopUpValue  = jsonresult.units;

                if (jsonresult.status != "00")
                {
                    transact.transactionsStatus = "pending";
                }
                else
                {
                    transact.transactionsStatus = "completed";
                    user.MainBalance            = user.MainBalance - Convert.ToDecimal(transact.Amount);
                    ExtraMethods.AddProfit(user, transact);
                    transact.AgentProfit = 0.005M * Convert.ToDecimal(transact.Amount);
                }

                //db.Entry(transaction).State = EntityState.Modified;
                _db.Update(transact);
                _db.SaveChanges();

                //return Ok(transact);
                return(Ok(new
                {
                    ID = transact.Id,
                    SERVICE = model.Service,
                    AMOUNT = transact.Amount,
                    METERNUMBER = transact.Meternumber,
                    METERNAME = transact.MeterName,
                    PAYER = transact.PayersName,
                    PHONENUMBER = transact.RecipientPhoneNumber,
                    STATUS = transact.transactionsStatus,
                    TOKEN = transact.Token,
                    DATE = transact.Datetime
                }));
            }
            catch (WebException ex)
            {
                if (ex.Status == WebExceptionStatus.ProtocolError && ex.Response != null)
                {
                    var resp = (HttpWebResponse)ex.Response;
                    if (resp.StatusCode == HttpStatusCode.NotFound) // HTTP 404
                    {
                        return(Ok("Transaction could not be completed"));
                    }
                }

                throw;
            }
        }