/**
  * @param $consoleCommand SyncCommandBase
  * @return \Closure
  */
 private static function generatePublisher($consoleCommand)
 {
     return function ($conversationsList) use($consoleCommand) {
         // Publish/create tickets
         // ----------------------
         $errorMapping = array();
         $consoleCommand->createProgressBar(count($conversationsList));
         /* @var $hybridConversation HybridConversation */
         foreach ($conversationsList as $hybridConversation) {
             /* @var $conversation Conversation */
             $conversation = $hybridConversation->getConversation();
             $grooveTicketNumber = $hybridConversation->getGrooveTicketNumber();
             try {
                 $client = $consoleCommand->getHelpScoutClient();
                 $createConversationResponse = $consoleCommand->makeRateLimitedRequest(HELPSCOUT, function () use($client, $conversation) {
                     $client->createConversation($conversation, true);
                     // imported = true to prevent spam!
                 });
             } catch (ApiException $e) {
                 $createdBy = $conversation->getCreatedBy()->getEmail() ? $conversation->getCreatedBy()->getEmail() : "user #" . $conversation->getCreatedBy()->getId();
                 $consoleCommand->error("Failed to upload HelpScout conversation \"" . $conversation->getSubject() . "\" by " . $createdBy . " at " . $conversation->getCreatedAt() . " (Groove ticket #{$grooveTicketNumber}). Message was: \n" . APIHelper::formatApiExceptionArray($e));
                 if ($e->getErrors()) {
                     foreach ($e->getErrors() as $error) {
                         $errorMessage = 'Error: [' . $error['property'] . '] ' . $error['message'] . ' (value = ' . print_r($error['value'], TRUE) . ") (Groove ticket #{$grooveTicketNumber})";
                         $errorMapping[$error['message']][] = $errorMessage;
                         $consoleCommand->getProgressBar()->setMessage($errorMessage . str_pad(' ', 20));
                     }
                 } else {
                     $errorMapping[$e->getMessage()][] = "[" . $conversation->getCreatedAt() . "] " . $conversation->getSubject() . " (Groove ticket #{$grooveTicketNumber})";
                 }
             } catch (\CurlException $ce) {
                 $errorMessage = "CurlException encountered while publishing Groove ticket #{$grooveTicketNumber} \"" . $conversation->getSubject() . "\" (created by " . $conversation->getCreatedBy()->getEmail() . " at " . $conversation->getCreatedAt() . ")";
                 $consoleCommand->error($errorMessage . ": " . $ce->getMessage());
                 $errorMapping[$ce->getMessage()][] = $errorMessage;
             } catch (\ErrorException $errex) {
                 $errorMessage = "Exception encountered while publishing Groove ticket #{$grooveTicketNumber} \"" . $conversation->getSubject() . "\" (created by " . $conversation->getCreatedBy()->getEmail() . " at " . $conversation->getCreatedAt() . ")";
                 $consoleCommand->error($errorMessage . ": " . $errex->getMessage());
                 $errorMapping[$errex->getMessage()][] = $errorMessage;
             } catch (\Exception $ex) {
                 $errorMessage = "Exception encountered while publishing Groove ticket #{$grooveTicketNumber} \"" . $conversation->getSubject() . "\" (created by " . $conversation->getCreatedBy()->getEmail() . " at " . $conversation->getCreatedAt() . ")";
                 $consoleCommand->error($errorMessage . ": " . $ex->getMessage());
                 $errorMapping[$ex->getMessage()][] = $errorMessage;
             }
             $consoleCommand->getProgressBar()->advance();
         }
         if ($consoleCommand->getProgressBar()->getMaxSteps() === 0) {
             $consoleCommand->getProgressBar()->clear();
         } else {
             $consoleCommand->getProgressBar()->finish();
         }
         if (sizeof($errorMapping) > 0) {
             $filename = 'sync-tickets-' . date('YmdHis');
             $contents = APIHelper::convertErrorMappingArrayToCSVArray($errorMapping);
             APIHelper::exportArrayToCSV($filename, $contents);
             $consoleCommand->warn("\nEncountered " . count($contents) . " errors, which have been exported to {$filename}.csv (default location: storage/exports)");
         }
     };
 }
 /**
  * @param $consoleCommand SyncCommandBase
  * @return \Closure
  */
 private static function generatePublisher($consoleCommand)
 {
     return function ($customersList) use($consoleCommand) {
         // Publish/create customers
         // ------------------------
         $errorMapping = array();
         $consoleCommand->createProgressBar(count($customersList));
         /* @var $customer \HelpScout\model\Customer */
         foreach ($customersList as $customer) {
             try {
                 $client = $consoleCommand->getHelpScoutClient();
                 $helpscoutCreateCustomerResponse = $consoleCommand->makeRateLimitedRequest(HELPSCOUT, function () use($client, $customer) {
                     $client->createCustomer($customer);
                 });
             } catch (ApiException $e) {
                 //                    $customerEmails = array_map(function($emailEntry) {
                 //                        /* @var $emailEntry \HelpScout\model\customer\EmailEntry */
                 //                        return $emailEntry->getValue();
                 //                    }, $customer->getEmails());
                 //                    $consoleCommand->error("Failed to upload HelpScout customer (" . implode(',', $customerEmails) . ")" . ". Message was: " . APIHelper::formatApiExceptionArray($e));
                 foreach ($e->getErrors() as $error) {
                     $errorMapping[$error['message']][] = "[" . $error['property'] . "] " . $error['message'] . ": " . $error['value'];
                     $consoleCommand->getProgressBar()->setMessage('Error: [' . $error['property'] . '] ' . $error['message'] . ' (' . $error['value'] . ')' . str_pad(' ', 20));
                 }
             }
             $consoleCommand->getProgressBar()->advance();
         }
         if ($consoleCommand->getProgressBar()->getMaxSteps() === 0) {
             $consoleCommand->getProgressBar()->clear();
         } else {
             $consoleCommand->getProgressBar()->finish();
         }
         if (sizeof($errorMapping) > 0) {
             $filename = 'sync-customers-' . date('YmdHis');
             $contents = APIHelper::convertErrorMappingArrayToCSVArray($errorMapping);
             APIHelper::exportArrayToCSV($filename, $contents);
             $consoleCommand->warn("\nEncountered " . count($contents) . " errors, which have been exported to {$filename}.csv (default location: storage/exports)");
         }
     };
 }