private void ValidateInvite(InviteToSignup sitterInvite, ServiceResult result)
 {
     if (string.IsNullOrWhiteSpace(sitterInvite.MobilePhone))
     {
         result.Message = "Mobile phone is required";
     }
     else if (!PhoneUtil.IsValidPhoneNumber(sitterInvite.MobilePhone))
     {
         result.Message = "Mobile phone is not a valid phone";
     }
 }
        public void ProcessSignupInviteConversation(TxtMsgInbound msgInbound, TxtMsgAwaitingResponse awaiting, AppUser user)
        {
            string mobileToInvite = PhoneUtil.CleanAndEnsureCountryCode(msgInbound.Message);
            if (MessageUtility.IsCancelRequested(msgInbound))
            {
                _omm.SendFeedbackToInboundMessageAndDeleteAwaiting(msgInbound, string.Format("Ok, invitation cancelled."), user.Id, awaiting);
                return;
            }
            if (!PhoneUtil.IsValidPhoneNumber(mobileToInvite))
            {
                _omm.SendFeedbackToInboundMessage(msgInbound, string.Format("'{0}' is not a valid mobile number to invite to signup for mysitterhub.com. Please enter 10 digit number. Or say 'cancel'.", msgInbound.Message), user.Id);
                return;
            }

            int parentId = awaiting.WaitingForUserId;
            AppUser parentUser = new AppUserDal().GetById(parentId);

            if (parentUser.UserRole != UserRole.Parent)
            {
                //STEP - make sure user is a Parent, if not say only parents can invite sitters.
                _omm.SendFeedbackToInboundMessage(msgInbound, MessageTemplates.OnlyParentsCanSendSignupInvites(), user.Id);
            }
            else
            {
                //STEP - confirm sending invite
                _omm.SendFeedbackToInboundMessage(msgInbound, "Sending invite to " + mobileToInvite, user.Id);
                var sitterInvite = new InviteToSignup {MobilePhone = mobileToInvite};
                ServiceResult result = new ParentRepository().AddSitterInviteByMobile(parentId, sitterInvite);
                if (!result.IsSuccess)
                {
                    _omm.SendFeedbackToInboundMessage(msgInbound, "Error while sending invite to " + mobileToInvite + " please try again.", user.Id);
                }
            }
            _txtMsgAwaitingResponseDal.DeleteAwaiting(awaiting.Id);
        }
        public ServiceResult AddSitterInviteByMobile(int parentId, InviteToSignup sitterInvite)
        {
            var result = new ServiceResult();

            // STEP - Validate
            ValidateInvite(sitterInvite, result);
            if (result.Message != null)
                return result;

            // STEP - Populate rest of fields
            sitterInvite.MobilePhone = PhoneUtil.CleanAndEnsureCountryCode(sitterInvite.MobilePhone);
            sitterInvite.InviteDate = TimeUtil.GetCurrentUtcTime();
            sitterInvite.InviteStatus = InvitationState.InvitePending;

            // STEP - Get Parent
            Parent p = _parentDal.GetById(parentId);
            if (p == null)
                throw new AppException("Parent not found with ID " + parentId);
            if (p.InviteToSignup == null)
                p.InviteToSignup = new List<InviteToSignup>();
            if (p.Sitters == null)
                p.Sitters = new List<ParentMySitter>();


            // STEP - Check if Invited mobile is already in Parent - MySitters.
            AppUser usr = _appUserDal.GetByMobile(sitterInvite.MobilePhone);
            if (usr != null) // Invited Mobile does not belong to an existing user.
            {
                if (usr.UserRole != UserRole.Sitter)
                {
                    result.Message = "Invited User is parent which is not supported at this time.";
                    return result;
                }

                // STEP - Check if sitter already in parent mysitters
                foreach (ParentMySitter sid in p.Sitters)
                {
                    Sitter sf = _sitterDal.GetById(sid.SitterId);
                    if (sf != null && sf.User.MobilePhone == sitterInvite.MobilePhone)
                    {
                        result.Message = "Parent already has sitter in network with mobile " + sitterInvite.MobilePhone;
                        return result;
                    }
                }
            }

            if (p.InviteToSignup.Any(m => m.MobilePhone == sitterInvite.MobilePhone))
            {
                result.Message = string.Format("Mobile '{0}' has already been invited.", sitterInvite.MobilePhone);
                return result;
            }
            p.InviteToSignup.Add(sitterInvite);

            // STEP - Persist
            _parentDal.Update(p);

            // STEP - Mark as successfully added
            result.IsSuccess = true;
            return result;
        }