/**
  * @param EmailModel $model
  *
  * @SuppressWarnings(PHPMD.NPathComplexity)
  * @SuppressWarnings(PHPMD.CyclomaticComplexity)
  * @SuppressWarnings(PHPMD.ExcessiveMethodLength)
  */
 protected function processEmailModel(EmailModel $model)
 {
     /**
      * TODO EmailEntityBuilder::email or EmailEntityBuilder::emailUser should be user here
      */
     $this->assertModel($model);
     $currentDate = new \DateTime('now', new \DateTimeZone('UTC'));
     $messageDate = $model->getSentAt() ?: $currentDate;
     $this->ensureEmailEntitySet($model);
     $email = $model->getEntity();
     // Subject
     if ($model->getSubject()) {
         $this->processString($email, 'Subject', $model->getSubject());
     }
     // From
     if ($model->getFrom()) {
         $this->processSender($email, $model->getFrom());
     }
     // To
     if ($model->getTo()) {
         $this->processRecipients($email, EmailRecipient::TO, $model->getTo());
     }
     // Cc
     if ($model->getCc()) {
         $this->processRecipients($email, EmailRecipient::CC, $model->getCc());
     }
     // Bcc
     if ($model->getBcc()) {
         $this->processRecipients($email, EmailRecipient::BCC, $model->getBcc());
     }
     // Body
     if ($model->getBody()) {
         $this->processBody($email, $model->getBody(), $model->getBodyType());
     } elseif ($model->getBodyType()) {
         $this->processBodyType($email, $model->getBodyType());
     }
     // CreatedAt
     if ($model->getCreatedAt()) {
         $email->setCreated($model->getCreatedAt());
     } elseif (!$email->getId()) {
         $email->setCreated($messageDate);
     }
     // SentAt
     if ($model->getSentAt()) {
         $email->setSentAt($model->getSentAt());
     } elseif (!$email->getId()) {
         $email->setSentAt($messageDate);
     }
     // InternalDate
     if ($model->getInternalDate()) {
         $email->setInternalDate($model->getInternalDate());
     } elseif (!$email->getId()) {
         $email->setInternalDate($messageDate);
     }
     // Importance
     if (null !== $model->getImportance()) {
         $this->processImportance($email, $model->getImportance());
     }
     // Head
     if (null !== $model->isHead()) {
         $this->processHead($email, $model->isHead());
     }
     // MessageId
     if (null !== $model->getMessageId()) {
         $this->processString($email, 'MessageId', $model->getMessageId());
     }
     // XMessageId
     if (null !== $model->getXMessageId()) {
         $this->processString($email, 'XMessageId', $model->getXMessageId());
     }
     // XThreadId
     if (null !== $model->getXThreadId()) {
         $this->processString($email, 'XThreadId', $model->getXThreadId());
     }
     // Thread
     if (null !== $model->getThread()) {
         $this->processThread($email, $model->getThread());
     }
     // Refs
     if (null !== $model->getRefs()) {
         $this->processRefs($email, $model->getRefs());
     }
     // process EmailUser entities for each folder
     $emailUsers = $this->processFolders($email, $model->getFolders());
     foreach ($emailUsers as $emailUser) {
         // ReceivedAt
         if ($model->getReceivedAt()) {
             $emailUser->setReceivedAt($model->getReceivedAt());
         } elseif (!$email->getId()) {
             $emailUser->setReceivedAt($messageDate);
         }
         // Seen
         if (null !== $model->isSeen()) {
             $emailUser->setSeen($model->isSeen());
         }
         $this->emailEntityBuilder->setObject($emailUser);
     }
     $this->emailEntityBuilder->getBatch()->persist($this->entityManager);
 }