public async Task <PaymentResponse> ChoosePaymentHandler(Payment_Dto payment_dto)
        {
            var pendingState = await GetPaymentStatusByStatus((int)PaymentStatusEnum.PENDING);

            if (pendingState is null)
            {
                throw new NullReferenceException(nameof(pendingState));
            }

            payment_dto.Status = pendingState.Id;
            Payment PaymentModel = _mapper.Map <Payment_Dto, Payment>(payment_dto);

            switch (payment_dto.amount)
            {
            case decimal amount when payment_dto.amount <= 20:
                _logger.LogInformation("Using ICheapPaymentGateway for processing payment");
                return(await ICheapPaymentGateway(PaymentModel, 0));

            case decimal amount when payment_dto.amount > 20 && payment_dto.amount < 500:
                _logger.LogInformation("Using IExpensivePaymentGateway for processing payment");
                return(await IExpensivePaymentGateway(PaymentModel, false, 0));

            default:
                _logger.LogInformation("Using PremiumPaymentService for processing payment");
                return(await IExpensivePaymentGateway(PaymentModel, true, 0));
            }
        }
        public async Task<IActionResult> ProcessPayment(Payment_Dto model, [FromServices] IOptions<ApiBehaviorOptions> apiBehaviorOptions)
        {
            if (!ModelState.IsValid)
                return BadRequest(ModelState);

            var validationResult = validators.ValidateModel(model);
            if (!validationResult.Item1)
            {
                foreach (KeyValuePair<string, string> error in validationResult.Item2)
                {
                    ModelState.AddModelError(error.Key, error.Value);
                }
                return apiBehaviorOptions.Value.InvalidModelStateResponseFactory(ControllerContext);
            }
            var result = await _paymentRepository.ChoosePaymentHandler(model);
            Response.Headers.Add("X-Resource", Url.Action("Get", new { id = result.Id}));
            return Created("get_payment_status", result);
        }
        public (bool, List <KeyValuePair <string, string> >) ValidateModel(Payment_Dto model)
        {
            bool isValid = true;
            List <KeyValuePair <string, string> > errors = new List <KeyValuePair <string, string> >();
            bool validNumber = ValidateCreditCard(model.card_number);

            if (!validNumber)
            {
                isValid = false;
                errors.Add(new KeyValuePair <string, string>("card_number", "invalid credit card"));
            }
            var validExpiryDate = validateExpiryDate(model.expiry_date, DateTime.UtcNow);

            if (!validExpiryDate.Item1)
            {
                isValid = validExpiryDate.Item1;
                errors.Add(validExpiryDate.Item2.Value);
            }
            return(isValid, errors);
        }