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 ServiceResult CancelInviteSitter(int parentId, string sitterMobilePhone, bool isSitterDecline = false)
        {
            var result = new ServiceResult();

            if (string.IsNullOrWhiteSpace(sitterMobilePhone))
            {
                result.Message = "Mobile phone is required";
                return result;
            }
            else if (!PhoneUtil.IsValidPhoneNumber(sitterMobilePhone))
            {
                result.Message = "Mobile phone is not a valid phone";
                return result;
            }
            sitterMobilePhone = PhoneUtil.CleanAndEnsureCountryCode(sitterMobilePhone);

            var p = _parentDal.GetById(parentId);
            if (p == null)
            {
                result.Message = "Parent not found";
                return result;
            }
            var invite = p.InviteToSignup.FirstOrDefault(m => m.MobilePhone == sitterMobilePhone);
            if (invite == null)
            {
                result.Message = "Unable to cancel invite, mobile phone not found.";
                return result;
            }
            if (isSitterDecline)
            {
                invite.InviteStatus = InvitationState.Declined;
            }
            else
            {
                p.InviteToSignup.Remove(invite);                
            }
            _parentDal.Update(p);

            result.IsSuccess = true;
            return result;
        }
        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;
        }