public async Task <PaymentResult> MakePayment(PaymentRequest paymentRequest)
        {
//style -> RETURN errors as part of return value
            PaymentResult result = new PaymentResult();

            Payment payment = null;
            //validate the accounts first
            //these calls returning bool on validation
            bool isValidAccount = await _bankClient.CheckAccount(paymentRequest.payee.accountNumber, paymentRequest.payee.ifscCode);

            if (!isValidAccount)
            {
                result.SetResult(PaymentResult.ResultCodes.InvalidInput, PaymentResult.StatusCodes.InvalidPayeeAccount, null);
                return(result);
            }
            isValidAccount = await _bankClient.CheckAccount(paymentRequest.beneficiary.accountNumber, paymentRequest.beneficiary.ifscCode);

            if (!isValidAccount)
            {
                result.SetResult(PaymentResult.ResultCodes.InvalidInput, PaymentResult.StatusCodes.InvalidBeneficieryAccount, null);
                return(result);
            }

            //a hard coded sample check representing a biz logic
            if (paymentRequest.amount > 1000000)
            {
                result.SetResult(PaymentResult.ResultCodes.TransactionError, PaymentResult.StatusCodes.AmountExceedLimit, null);
                return(result);
            }

            //create payment entry with initial status "InProgress"
            payment = new Payment(paymentRequest.beneficiary.name, paymentRequest.beneficiary.accountNumber, paymentRequest.beneficiary.ifscCode,
                                  paymentRequest.payee.name, paymentRequest.payee.accountNumber, paymentRequest.payee.ifscCode, paymentRequest.amount, PaymentStatus.InProgress);

            _context.Payments.Add(payment);
            await _context.SaveChangesAsync();

            result.SetResult(PaymentResult.ResultCodes.InProgress, PaymentResult.StatusCodes.TransactionInitiated, payment);
            //do the transaction
            //debit payee
            result.SetResult(PaymentResult.ResultCodes.InProgress, PaymentResult.StatusCodes.PayeeDebited, payment);
            //credit beneficiary
            result.SetResult(PaymentResult.ResultCodes.InProgress, PaymentResult.StatusCodes.BeneficiaryCredited, payment);

            //update status in database
            payment._status = PaymentStatus.Completed;
            _context.Payments.Update(payment);
            await _context.SaveChangesAsync();

            result.SetResult(PaymentResult.ResultCodes.Success, PaymentResult.StatusCodes.TransactionInitiated, payment);

            //return the payment result
            return(result);
        }