/**
  * at which sequence is the message with the highest messageUid (cache + imap)?
  * 
  * @param Felamimail_Model_Folder $_folder
  * @param Felamimail_Backend_ImapProxy $_imap
  * @param boolean $_updateFolder
  * @throws Felamimail_Exception
  * @throws Felamimail_Exception_IMAPMessageNotFound
  */
 protected function _updateMessageSequence(Felamimail_Model_Folder $_folder, Felamimail_Backend_ImapProxy $_imap, $_updateFolder = TRUE)
 {
     if ($_folder->imap_totalcount > 0) {
         $transactionId = Tinebase_TransactionManager::getInstance()->startTransaction(Tinebase_Core::getDb());
         $lastFailedUid = null;
         $messageSequence = null;
         $decrementMessagesCounter = 0;
         $decrementUnreadCounter = 0;
         while ($messageSequence === null) {
             $latestMessageUidArray = $this->_getLatestMessageUid($_folder);
             if (is_array($latestMessageUidArray)) {
                 $latestMessageId = key($latestMessageUidArray);
                 $latestMessageUid = current($latestMessageUidArray);
                 if (Tinebase_Core::isLogLevel(Zend_Log::DEBUG)) {
                     Tinebase_Core::getLogger()->debug(__METHOD__ . '::' . __LINE__ . " {$latestMessageId}  {$latestMessageUid}");
                 }
                 if ($latestMessageUid === $lastFailedUid) {
                     throw new Felamimail_Exception('Failed to delete invalid messageuid from cache');
                 }
                 if (Tinebase_Core::isLogLevel(Zend_Log::DEBUG)) {
                     Tinebase_Core::getLogger()->debug(__METHOD__ . '::' . __LINE__ . " Check messageUid {$latestMessageUid} in folder " . $_folder->globalname);
                 }
                 try {
                     $this->_imapMessageSequence = $_imap->resolveMessageUid($latestMessageUid);
                     $this->_cacheMessageSequence = $_folder->cache_totalcount;
                     $messageSequence = $this->_imapMessageSequence + 1;
                 } catch (Zend_Mail_Protocol_Exception $zmpe) {
                     if (!$_updateFolder) {
                         throw new Felamimail_Exception_IMAPMessageNotFound('Message not found on IMAP');
                     }
                     // message does not exist on imap server anymore, remove from local cache
                     if (Tinebase_Core::isLogLevel(Zend_Log::DEBUG)) {
                         Tinebase_Core::getLogger()->debug(__METHOD__ . '::' . __LINE__ . " messageUid {$latestMessageUid} not found => remove from cache");
                     }
                     $lastFailedUid = $latestMessageUid;
                     $latestMessage = $this->_backend->get($latestMessageId);
                     $this->_backend->delete($latestMessage);
                     $decrementMessagesCounter++;
                     if (!$latestMessage->hasSeenFlag()) {
                         $decrementUnreadCounter++;
                     }
                 }
             } else {
                 $this->_imapMessageSequence = 0;
                 $messageSequence = 1;
             }
             if (!$this->_timeLeft()) {
                 $_folder->cache_status = Felamimail_Model_Folder::CACHE_STATUS_INCOMPLETE;
                 break;
             }
         }
         Tinebase_TransactionManager::getInstance()->commitTransaction($transactionId);
         if ($decrementMessagesCounter > 0 || $decrementUnreadCounter > 0) {
             Felamimail_Controller_Folder::getInstance()->updateFolderCounter($_folder, array('cache_totalcount' => "-{$decrementMessagesCounter}", 'cache_unreadcount' => "-{$decrementUnreadCounter}"));
         }
     }
     if (Tinebase_Core::isLogLevel(Zend_Log::DEBUG)) {
         Tinebase_Core::getLogger()->debug(__METHOD__ . '::' . __LINE__ . " Cache status cache total count: {$_folder->cache_totalcount} imap total count: {$_folder->imap_totalcount} cache sequence: {$this->_cacheMessageSequence} imap sequence: {$this->_imapMessageSequence}");
     }
 }