async public Task <StatusMessages> ExpensivePaymentGateway(PaymentCardDetails _PaymentCardDetails)
        {
            StatusMessages _StatusMessages = new StatusMessages();

            var _SampleCardDetails = await SampleCardDetails(_PaymentCardDetails);

            if (_SampleCardDetails != null)
            {
                _StatusMessages.Status  = "Success";
                _StatusMessages.Message = "Success";
            }
            else
            {
                var TryCheapPaymentGateway = await CheapPaymentGateway(_PaymentCardDetails);

                if (TryCheapPaymentGateway != null)
                {
                    _StatusMessages.Status  = "Success";
                    _StatusMessages.Message = "Success";
                }
                else
                {
                    _StatusMessages.Status  = "Failed";
                    _StatusMessages.Message = "Not Found";
                }
            }


            return(_StatusMessages);
        }
        async public Task <StatusMessages> PremiumPaymentService(PaymentCardDetails _PaymentCardDetails)
        {
            StatusMessages _StatusMessages = new StatusMessages();

            var _SampleCardDetails = await SampleCardDetails(_PaymentCardDetails);

            if (_SampleCardDetails != null)
            {
                _StatusMessages.Status  = "Success";
                _StatusMessages.Message = "Success";
            }
            else
            {
                for (var k = 0; k < 1; k++)
                {
                    _SampleCardDetails = await SampleCardDetails(_PaymentCardDetails);

                    if (_SampleCardDetails != null)
                    {
                        _StatusMessages.Status  = "Success";
                        _StatusMessages.Message = "Success";
                        break;
                    }
                    else
                    {
                        _StatusMessages.Status  = "Failed";
                        _StatusMessages.Message = "Not Found";
                    }
                }
            }


            return(_StatusMessages);
        }
        async public Task <StatusMessages> SavePaymentStatus(PaymentCardDetails _PaymentCardDetails)
        {
            StatusMessages _StatusMessages = new StatusMessages();

            await _PaymentAccessPortalContext.AddAsync(_PaymentCardDetails);

            _PaymentAccessPortalContext.SaveChanges();

            return(_StatusMessages);
        }
        async public Task <PaymentCardDetails> SampleCardDetails(PaymentCardDetails _PaymentCardDetails)
        {
            var paymentCardDetails = await Task.FromResult(PaymentSampleCardDetails._PaymentSampleCardDetails.
                                                           FirstOrDefault(x => x.CreditCardNumber == _PaymentCardDetails.CreditCardNumber && x.CardHolder == _PaymentCardDetails.CardHolder && x.Amount > _PaymentCardDetails.Amount));

            if (paymentCardDetails == null)
            {
                return(null);
            }

            return(await Task.FromResult(paymentCardDetails));
        }
        public async void ProcessPayment()
        {
            //Arrange
            //  var controllerr = new PaymentController(_IPaymentGateway, _ICheapPaymentGateway, _IExpensivePaymentGateway, _IPremiumPaymentService);
            var _PaymentCardDetails = new PaymentCardDetails {
                CreditCardNumber = "5105105105105100", CardHolder = "Dolapo", SecurityCode = "12345", Amount = 30, ExpirationDate = Convert.ToDateTime("12/12/2021")
            };

            //Act
            var data = await _controller.ProcessPayment(_PaymentCardDetails);

            //Assert
            Assert.IsType <OkObjectResult>(data);
        }
        public bool ValidateCardDetails(PaymentCardDetails ClientCardDetails)
        {
            var CardExpDate = Convert.ToDateTime(ClientCardDetails.ExpirationDate);
            var CurrentDate = Convert.ToDateTime(DateTime.Today);


            if (ClientCardDetails.CardHolder == "" || ClientCardDetails.CardHolder == null)
            {
                return(false);
            }
            else if (CurrentDate > CardExpDate)
            {
                return(false);
            }
            else if (ClientCardDetails.Amount < 0)
            {
                return(false);
            }


            return(true);
        }
        public async Task <IActionResult> ProcessPayment([FromBody] PaymentCardDetails ClientCardDetails)
        {
            StatusMessages statusMessages = new StatusMessages();

            try
            {
                PaymentCardDetails _PaymentCardDetails = new PaymentCardDetails();

                var ValidateCard = ValidateCreditCard(ClientCardDetails.CreditCardNumber);

                if (ValidateCard == false)
                {
                    statusMessages.Status  = "failed";
                    statusMessages.Message = "Invalid credit card Details";
                    return(BadRequest(statusMessages));
                }
                else if (ValidateCardDetails(ClientCardDetails) == false)
                {
                    statusMessages.Status  = "failed";
                    statusMessages.Message = "The request is invalid:";
                    return(BadRequest(statusMessages));
                }


                else
                {
                    if (ClientCardDetails.Amount < 20)
                    {
                        var MakePayment = await _ICheapPaymentGateway.CheapPaymentGateway(ClientCardDetails);

                        if (MakePayment.Status == "Success")
                        {
                            ClientCardDetails.PaymentState = "processed";
                            await _IPaymentGateway.SavePaymentStatus(ClientCardDetails);

                            statusMessages.Status  = "Success";
                            statusMessages.Message = MakePayment.Message;
                        }
                        else
                        {
                            ClientCardDetails.PaymentState = "failed";
                            await _IPaymentGateway.SavePaymentStatus(ClientCardDetails);

                            statusMessages.Status  = "failed";
                            statusMessages.Message = MakePayment.Message;
                            return(BadRequest(statusMessages));
                        }
                    }
                    else if (ClientCardDetails.Amount > 20 && ClientCardDetails.Amount < 500)
                    {
                        var MakePayment = await _IExpensivePaymentGateway.ExpensivePaymentGateway(ClientCardDetails);

                        if (MakePayment.Status == "Success")
                        {
                            ClientCardDetails.PaymentState = "processed";
                            await _IPaymentGateway.SavePaymentStatus(ClientCardDetails);

                            statusMessages.Status  = "Success";
                            statusMessages.Message = MakePayment.Message;
                        }
                        else
                        {
                            ClientCardDetails.PaymentState = "failed";
                            await _IPaymentGateway.SavePaymentStatus(ClientCardDetails);

                            statusMessages.Status  = "failed";
                            statusMessages.Message = MakePayment.Message;
                            return(BadRequest(statusMessages));
                        }
                    }
                    else if (ClientCardDetails.Amount > 500)
                    {
                        var MakePayment = await _IPremiumPaymentService.PremiumPaymentService(ClientCardDetails);

                        if (MakePayment.Status == "Success")
                        {
                            ClientCardDetails.PaymentState = "processed";
                            await _IPaymentGateway.SavePaymentStatus(ClientCardDetails);

                            statusMessages.Status  = "Success";
                            statusMessages.Message = MakePayment.Message;
                        }
                        else
                        {
                            statusMessages.Status          = "failed";
                            statusMessages.Message         = MakePayment.Message;
                            ClientCardDetails.PaymentState = "pending";
                            await _IPaymentGateway.SavePaymentStatus(ClientCardDetails);

                            return(BadRequest(statusMessages));
                        }
                    }
                }



                return(Ok(statusMessages));
            }
            catch (Exception ex)
            {
                var result = StatusCode(StatusCodes.Status500InternalServerError, ex);
                return(result);
            }
        }