public HttpResponseMessage PendingVerification(SenderRequestModel requestModel)
        {
            if (!ModelState.IsValid)
            {
                return Request.CreateErrorResponse(HttpStatusCode.BadRequest, "Invalid Request");
            }

            requestModel = new SenderRequestModel()
            {
                CountryName = requestModel.CountryName,
                PhoneNumber = requestModel.PhoneNumber,
                IsoCodes = requestModel.IsoCodes.ToUpper(),
                ErrorMessage = requestModel.ErrorMessage,
                IsSmsSuccessfull = requestModel.IsSmsSuccessfull,
                SmsRequestId = requestModel.SmsRequestId
            };

            VerificationAction verifyActions = new VerificationAction();
            SenderResponseModel responseModel = verifyActions.SenderRequest(requestModel);

            if (responseModel.Error != null)
            {
                return Request.CreateResponse(HttpStatusCode.OK, responseModel, "application/json");
                
            }

            return Request.CreateResponse(HttpStatusCode.OK, responseModel, "application/json");
        }
 public SenderResponseModel SenderRequest(SenderRequestModel requestModel)
 {
     VerificationCase verifycase = new VerificationCase();
     return verifycase.SenderRequest(requestModel);
 }
        /// <summary>
        /// Sender Entertain Sms Request One By One
        /// </summary>
        /// <param name="requestModel"></param>
        /// <returns></returns>
        public SenderResponseModel SenderRequest(SenderRequestModel requestModel)
        {
            SenderResponseModel responseModel = new SenderResponseModel();

            DurationOfNextRequestToServerFromSender = SmsSendingInterval + SmsReceivingInterval + threeAttemptsByServer;

            #region //Check Whether SMS sent Or Not or Did sender previously  entertained any request
            if (requestModel.IsSmsSuccessfull == true && requestModel.ErrorMessage == null)
            {
                var GetSmsRequestObject = listOfSmsModel.Where(x => x.UniqueId == requestModel.SmsRequestId).FirstOrDefault();       // Mark status as sent 
                GetSmsRequestObject.IsSmsSuccessfull = true;
                GetSmsRequestObject.ErrorMessage = null;
                GetSmsRequestObject.SmsState = "Sent";
            }

            else if (requestModel.IsSmsSuccessfull == false && requestModel.ErrorMessage != null)
            {
                var GetSmsRequestObject = listOfSmsModel.Where(x => x.UniqueId == requestModel.SmsRequestId).FirstOrDefault();       //Mark Status as Read
                GetSmsRequestObject.IsSmsSuccessfull = false;
                GetSmsRequestObject.ErrorMessage = requestModel.ErrorMessage;
                GetSmsRequestObject.SmsState = "NotSent";
            }

            else if (requestModel.IsSmsSuccessfull == false && requestModel.ErrorMessage == null)
            {
                //Nothing To Do Means this Incoming Request from Sender Not Previously entertain any sms Request
            }
            #endregion

            #region //Check If Any pool Exist
            var IsPoolExist = PoolList.Any();   
            if (!IsPoolExist)
            {
                responseModel.IsValid = false;
                responseModel.Error = "No Pool Exist";
                return responseModel;
            }
            #endregion

            #region //Check If Country Exist in atleast one pool
            bool IsCountryExistInAnyPool = false;    
            foreach (var item in PoolList)
            {
                if (item.CountryCodes.Contains(requestModel.IsoCodes))
                {
                    IsCountryExistInAnyPool = true;
                    break;
                }

            }

            if (!IsCountryExistInAnyPool)
            {
                responseModel.IsValid = false;
                responseModel.Error = "No Pool Contains Specified Country";
                return responseModel;
            }
            #endregion

            #region //Add number to specific pool if not already exist
            bool IsContain = false;
            foreach (var item in PoolList)                              {
                //Check if current pools contains this country
                if (item.CountryCodes.Contains(requestModel.IsoCodes))
                {
                    //Check if this is 1st sender
                    if (item.ListOfSenders.Count == 0)
                    {
                        item.ListOfSenders.Add(
                            new ListOfSender
                            {
                                CoutryName = requestModel.CountryName,
                                IsoCode = requestModel.IsoCodes,
                                MobileNumber = requestModel.PhoneNumber,
                                IsActive = true
                            });
                    }


                    //Check if this sender is already in this pool
                    foreach (var phonenumbers in item.ListOfSenders)
                    {
                        //Ifnumber exist then update object
                        if (phonenumbers.MobileNumber == requestModel.PhoneNumber)
                        {
                            phonenumbers.LastAppear = DateTime.Now;
                            //phonenumbers.NextAppearTime = phonenumbers.LastAppear.AddSeconds(DurationOfNextRequest);
                            IsContain = true;
                            break;
                        }
                    }

                    //If sender is not in pool then add sender to current pool
                    if (!IsContain)
                    {
                        item.ListOfSenders.Add(
                        new ListOfSender
                        {
                            CoutryName = requestModel.CountryName,
                            IsoCode = requestModel.IsoCodes,
                            MobileNumber = requestModel.PhoneNumber,
                            LastAppear = DateTime.Now,
                            IsActive = true
                            //NextAppearTime = DateTime.Now.AddSeconds(DurationOfNextRequest)
                        });

                    }
                }
            }
            #endregion

            #region //Get All Request
            var getRequest = listOfSmsModel.OrderBy(x => x.RequestTime).Where(x => x.SmsState == "Unread" && x.CountryCode == requestModel.IsoCodes).ToList();
            #endregion

            #region //GetSenderObject
            var GetSenderObject = (from pool in PoolList
                                   from sendersList in pool.ListOfSenders
                                   where sendersList.MobileNumber == requestModel.PhoneNumber
                                   select sendersList).FirstOrDefault();
            GetSenderObject.IsActive = true; //Set Active Property o true
            #endregion

            #region //If no request exist then set next possible time to come
            if (getRequest == null || getRequest.Count == 0)
            {
                var sendersList = (from pool in PoolList
                                   from sendersLists in pool.ListOfSenders
                                   where pool.CountryCodes.Contains(requestModel.IsoCodes)
                                   select sendersLists).ToList();

                #region //If one sender then set next appear time of sender

                if (sendersList.Count == 1)
                {
                    GetSenderObject.NextAppearTime = DateTime.Now.AddSeconds(DurationOfNextRequestToServerFromSender);
                    //sendersList.OrderByDescending(x => x.NextAppearTime).FirstOrDefault().NextAppearTime = DateTime.Now.AddSeconds(DurationOfNextRequestToServerFromSender);
                    responseModel.Error = null;
                    responseModel.IsValid = true;
                    responseModel.EstimatedTimeToComeAgain = DurationOfNextRequestToServerFromSender;
                    responseModel.IsRequestexist = false;

                    return responseModel;
                }
                #endregion

                #region //Check if any sender has to come after datetime.Now 

                ListOfSender highestNextAppearTimeObject = sendersList.OrderByDescending(x => x.NextAppearTime).ElementAt(0);

                //if No sender Then add default time in datetime.Now and return defautl time interval to sender
                if (highestNextAppearTimeObject.NextAppearTime < DateTime.Now)
                {
                    GetSenderObject.NextAppearTime = DateTime.Now.AddSeconds(DurationOfNextRequestToServerFromSender);
                    //sendersList.OrderByDescending(x => x.NextAppearTime).FirstOrDefault().NextAppearTime = DateTime.Now.AddSeconds(DurationOfNextRequestToServerFromSender);
                    responseModel.EstimatedTimeToComeAgain = DurationOfNextRequestToServerFromSender;
                    responseModel.Error = null;
                    responseModel.IsValid = true;
                    responseModel.IsRequestexist = false;
                    return responseModel;
                }
                #endregion

                #region //Set Next Appear Time for sender According to highesttimeOfSender
                GetSenderObject.NextAppearTime = highestNextAppearTimeObject.NextAppearTime.AddSeconds(DurationOfNextRequestToServerFromSender);
                responseModel.EstimatedTimeToComeAgain = (GetSenderObject.NextAppearTime - DateTime.Now).TotalSeconds;
                responseModel.Error = null;
                responseModel.IsValid = true;
                responseModel.IsRequestexist = false;
                return responseModel;
                #endregion
            }
            #endregion

            #region //Assign To Sender
            getRequest[0].SmsState = "Read";
            getRequest[0].SenderId = requestModel.PhoneNumber;

            #endregion

            #region //Set Next Appear Time for sender Not fixed

            GetSenderObject.NextAppearTime = DateTime.Now.AddSeconds(DurationOfNextRequestToServerFromSender);

            #endregion

            #region //Return Response
            responseModel.PhoneNumber = getRequest[0].PhoneNumber;
            responseModel.Code = getRequest[0].PinCode;
            responseModel.EstimatedTimeToComeAgain = 0;
            responseModel.IsRequestexist = true;
            responseModel.SmsRequestId = getRequest[0].UniqueId;
            responseModel.IsValid = true;
            responseModel.Error = null;
            return responseModel;
            #endregion
        }