public function __invoke()
 {
     $today = $this->getDateInThePast(0);
     $oneWeekAgo = $this->getDateInThePast(7);
     $twoWeeksAgo = $this->getDateInThePast(14);
     $threeWeeksAgo = $this->getDateInThePast(21);
     $service = $this->adwords->getService('AdGroupService');
     $selector = new \Selector();
     $selector->predicates = [new \Predicate('Status', 'EQUALS', 'ENABLED'), new \Predicate('CampaignStatus', 'EQUALS', 'ENABLED')];
     $selector->orderBy = new \OrderBy('ctr', 'ASCENDING');
     $selector->paging = new \Paging(0, \AdWordsConstants::RECOMMENDED_PAGE_SIZE);
     do {
         $page = $service->get($selector);
         if (is_array($page->entries)) {
             foreach ($page->entries as $adGroup) {
                 // Let's look at the trend of the ad group's CTR.
                 $statsThreeWeeksAgo = $this->getStatsFor($adGroup, $threeWeeksAgo, $twoWeeksAgo);
                 $statsTwoWeeksAgo = $this->getStatsFor($adGroup, $twoWeeksAgo, $oneWeekAgo);
                 $statsLastWeek = $this->getStatsFor($adGroup, $oneWeekAgo, $today);
                 // Week over week, the ad group is declining - record that!
                 if ($statsLastWeek->getCtr() < $statsTwoWeeksAgo->getCtr() && $statsTwoWeeksAgo->getCtr() < $statsThreeWeeksAgo->getCtr()) {
                     reportRows . push([adGroup . getCampaign() . getName(), adGroup . getName(), statsLastWeek . getCtr() * 100, statsLastWeek . getCost(), statsTwoWeeksAgo . getCtr() * 100, statsTwoWeeksAgo . getCost(), statsThreeWeeksAgo . getCtr() * 100, statsThreeWeeksAgo . getCost()]);
                 }
             }
         }
         $selector->paging->startIndex += $selector->paging->numberResults;
     } while (!is_null($page->entries));
 }
 /**
  * Make sure that we have a label
  */
 protected function createLabel()
 {
     $labelService = $this->adwords->getService('LabelService');
     $selector = new \Selector();
     $selector->fields = ['LabelId'];
     $selector->predicates = [new \Predicate('LabelName', 'EQUALS', $this->labelName)];
     $page = $labelService->get($selector);
     if (count($page->entries) === 0) {
         $this->logger->info('creating label "' . $this->labelName . '"');
         $label = new \TextLabel(null, $this->labelName, 'ENABLED');
         $operation = new \LabelOperation();
         $operation->operand = $label;
         $operation->operator = 'ADD';
         $result = $labelService->mutate([$operation]);
         // get label
         // store in $this->label
     } else {
         $this->label = $page->entries[0];
     }
 }
 protected function getAds($offset = 0, $limit = \AdWordsConstants::RECOMMENDED_PAGE_SIZE)
 {
     $criterionService = $this->adwords->getService('AdGroupAdService');
     $selector = new \Selector();
     $selector->fields = ['Id', 'CreativeFinalMobileUrls', 'CreativeFinalUrls', 'DisplayUrl', 'Url', 'Status', 'Labels', 'AdGroupId'];
     $selector->predicates = [new \Predicate('Status', 'EQUALS', 'ENABLED'), new \Predicate('Url', 'STARTS_WITH_IGNORE_CASE', 'http')];
     $selector->ordering = new \OrderBy('Url', 'ASCENDING');
     $selector->paging = new \Paging($offset, $limit);
     $page = $criterionService->get($selector);
     if (is_null($page->entries)) {
         return null;
     } else {
         return $page->entries;
     }
 }