/**
  *
  * @throws Exception
  * @return int
  */
 public function synchronize()
 {
     if ($masterListId = $this->_getAlreadyCreatedMasterListId()) {
         $segmentSynch = new HooksSynchronizationSegment($this->_getApiOverlay());
         $segmentSynch->deleteList($masterListId);
     }
     $apiOverlay = $this->_getApiOverlay();
     $params = array('method' => 'JSON', 'Name' => self::LIST_NAME);
     $newMailjetList = $apiOverlay->createContactsListP($params);
     if (!$newMailjetList || !isset($newMailjetList->ID)) {
         throw new HooksSynchronizationException('There is a problem with the list\'s creation.');
     }
     $newlyCreatedListId = $newMailjetList->ID;
     if (!is_numeric($newlyCreatedListId)) {
         throw new HooksSynchronizationException('The API response is not correct.');
     }
     // increase the memory limit because the database could contain too many customers
     ini_set('memory_limit', '1028M');
     $allUsers = $this->_getAllActiveCustomers();
     if (count($allUsers) === 0) {
         throw new HooksSynchronizationException('You don\'t have any users in the database.');
     }
     $segmentationObject = new Segmentation();
     $contstToAddCsv = array();
     foreach ($allUsers as $userInfo) {
         $contstToAddCsv[] = array($userInfo['email'], $userInfo['firstname'], $userInfo['lastname']);
     }
     /*
      * Sets related contact meta data like firstname, lastname, etc...
      */
     $this->_getApiOverlay()->setContactMetaData(array(array('Datatype' => 'str', 'Name' => $segmentationObject->ll(48), 'NameSpace' => 'static'), array('Datatype' => 'str', 'Name' => $segmentationObject->ll(49), 'NameSpace' => 'static')));
     $headers = array("email", "firstname", "lastname");
     $contstToAddCsvString = '';
     $contstToAddCsvString .= implode(",", $headers) . "\n";
     foreach ($contstToAddCsv as $contact) {
         $contstToAddCsvString .= implode(",", $contact) . "\n";
     }
     $apiResponse = $apiOverlay->createContacts($contstToAddCsvString, $newlyCreatedListId);
     if (!isset($apiResponse->ID)) {
         $segmentSynch = new HooksSynchronizationSegment($this->_getApiOverlay());
         $segmentSynch->deleteList($newlyCreatedListId);
         throw new HooksSynchronizationException('There is a problem with the creation of the contacts.');
     }
     $batchJobResponse = $apiOverlay->batchJobContacts($newlyCreatedListId, $apiResponse->ID);
     if ($batchJobResponse == false) {
         throw new HooksSynchronizationException('Batchjob problem');
     }
     return $newlyCreatedListId;
 }
 /**
  * 
  * @param array $contacts
  * @param int $existingListId
  * @return string
  */
 private function _update($contacts, $existingListId)
 {
     $segmentationObject = new Segmentation();
     // ** ** Détection du bon Index
     $mail_index = 'Email';
     if ($contacts) {
         $contact_ids = array_keys($contacts[0]);
         foreach ($contact_ids as $k) {
             if (preg_match('/(mail)/', $k)) {
                 $mail_index = $k;
             } else {
                 if ($k == $segmentationObject->ll(48)) {
                     $firstNameIndex = $k;
                 } else {
                     if ($k == $segmentationObject->ll(49)) {
                         $lastNameIndex = $k;
                     }
                 }
             }
         }
     }
     $prestashopContacts = array();
     $contactsToCsv = array();
     foreach ($contacts as $contact) {
         $prestashopContacts[] = $contact[$mail_index];
         if (!empty($contact[$mail_index])) {
             $contactsToCsv[$contact[$mail_index]] = array($contact[$mail_index], $contact[$firstNameIndex], $contact[$lastNameIndex]);
         }
     }
     $this->_gatherCurrentContacts($existingListId);
     $contacstToAdd = array();
     $contacstToRemove = array();
     foreach ($prestashopContacts as $email) {
         if (!in_array($email, $this->_mailjetContacts)) {
             $contacstToAdd[] = $contactsToCsv[$email];
         }
     }
     foreach ($this->_mailjetContacts as $email) {
         if (!in_array($email, $prestashopContacts)) {
             $contacstToRemove[] = $email;
         }
     }
     $response = 'Pending';
     try {
         if (!empty($contacstToAdd)) {
             /*
              * Sets related contact meta data like firstname, lastname, etc...
              */
             $this->_getApiOverlay()->setContactMetaData(array(array('Datatype' => 'str', 'Name' => 'firstname', 'NameSpace' => 'static'), array('Datatype' => 'str', 'Name' => 'lastname', 'NameSpace' => 'static')));
             $headers = array("email", "firstname", "lastname");
             $contstToAddCsv = '';
             $contstToAddCsv .= implode(",", $headers) . "\n";
             foreach ($contactsToCsv as $contact) {
                 $contstToAddCsv .= implode(",", $contact) . "\n";
             }
             $res = $this->_getApiOverlay()->createContacts($contstToAddCsv, $existingListId);
             if (!isset($res->ID)) {
                 throw new HooksSynchronizationException('Create contacts problem');
             }
             $batchJobResponse = $this->_getApiOverlay()->batchJobContacts($existingListId, $res->ID, 'addforce');
             if ($batchJobResponse == false) {
                 throw new HooksSynchronizationException('Batchjob problem');
             }
         }
         if (!empty($contacstToRemove)) {
             $contstToRemoveCsv = implode(' ', $contacstToRemove);
             $res = $this->_getApiOverlay()->createContacts($contstToRemoveCsv, $existingListId);
             if (!isset($res->ID)) {
                 throw new HooksSynchronizationException('Create contacts problem');
             }
             $batchJobResponse = $this->_getApiOverlay()->batchJobContacts($existingListId, $res->ID, 'remove');
             if ($batchJobResponse == false) {
                 throw new HooksSynchronizationException('Batchjob problem');
             }
         }
         $response = 'OK';
     } catch (Exception $e) {
         $response = $e;
     }
     return $response;
 }