public HttpResponseMessage Post(CardInformationDTO card)
 {
     try
     {
         if (ModelState.IsValid)
         {
             PaymentProcessService payment = new PaymentProcessService(_repoWrapper, _mapper, _unitOfWork, _cheapPaymentGateway, _expensivePaymentGateway, _preminumServiceGateway);
             int status = payment.PaymentProcessBusinessLogic(card);
             if (status == 200)
             {
                 return(new HttpResponseMessage(HttpStatusCode.OK));
             }
             else if (status == 400)
             {
                 return(new HttpResponseMessage(HttpStatusCode.BadRequest));
             }
             else
             {
                 return(new HttpResponseMessage(HttpStatusCode.InternalServerError));
             }
         }
         else
         {
             return(new HttpResponseMessage(HttpStatusCode.BadRequest));
         }
     }
     catch (Exception ex)
     {
         return(new HttpResponseMessage(HttpStatusCode.InternalServerError));
     }
 }
        public int PaymentProcessBusinessLogic(CardInformationDTO cardModel)
        {
            try
            {
                PaymentStatusDTO payment = new PaymentStatusDTO();
                var cardTable            = _mapper.Map <CardInformation>(cardModel);
                var paymentTable         = _mapper.Map <PaymentStatus>(payment);
                if (Common.isValid((long.Parse(cardTable.CreditCardNumber))))
                {
                    if (cardTable.ExpirationDate.Year >= DateTime.Now.Year && cardTable.ExpirationDate.Month >= DateTime.Now.Month)
                    {
                        Task <int> finishedTask = null;

                        if (cardModel.Amount <= 20)
                        {
                            Task <int> finishedTask1 = Task.Run(() => _cheapPaymentGateway.ProcessPayment(cardTable));

                            if (!finishedTask1.IsCompleted)
                            {
                                int result = finishedTask1.Result;
                                paymentTable.Status = "Processed";
                                Save(cardTable, paymentTable);
                                return(200);
                            }
                        }
                        else if (cardModel.Amount >= 21 && cardModel.Amount <= 500)
                        {
                            finishedTask = Task.Run(() => _expensivePaymentGateway.ProcessPayment(cardTable));

                            if (!finishedTask.IsCompleted)
                            {
                                Task <int> finishedTask2 = Task.Run(() => _cheapPaymentGateway.ProcessPayment(cardTable));
                                int        result        = finishedTask2.Result;
                                paymentTable.Status = "Pending";
                                Save(cardTable, paymentTable);
                                return(400);
                            }
                            else
                            {
                                paymentTable.Status = "Processed";
                                Save(cardTable, paymentTable);
                                return(200);
                            }
                        }
                        else if (cardModel.Amount > 500)
                        {
                            var attempts = 3;
                            do
                            {
                                try
                                {
                                    attempts++;
                                    finishedTask = Task.Run(() => _preminumServiceGateway.ProcessPayment(cardTable));
                                    if (finishedTask.IsCompleted)
                                    {
                                        paymentTable.Status = "Processed";
                                        Save(cardTable, paymentTable);
                                        break;
                                    }
                                }
                                catch (Exception ex)
                                {
                                    paymentTable.Status = "Failed";
                                    Save(cardTable, paymentTable);
                                    if (attempts == 3)
                                    {
                                        throw;
                                    }
                                    return(500);
                                }
                            } while (true);
                            return(200);
                        }
                    }
                    else
                    {
                        paymentTable.Status = "Pending";
                        Save(cardTable, paymentTable);
                        return(400);
                    }
                }
                else
                {
                    paymentTable.Status = "Pending";
                    Save(cardTable, paymentTable);
                    return(400);
                }

                return(200);
            }
            catch (Exception)
            {
                return(500);
            }
        }