/** @return Array Roady to be made into JSON */
 protected function run()
 {
     // This would be nice, but then we wouldn't delete candidates mistakenly marked as standing
     // $url = 'http://yournextmp.popit.mysociety.org/api/v0.1/search/persons?q=_exists_:standing_in.2015.post_id&page=';
     $url = 'https://yournextmp.popit.mysociety.org/api/v0.1/persons?page=';
     $page = 0;
     $morePages = true;
     $countryRepo = new \repositories\CountryRepository();
     $areaRepo = new \repositories\AreaRepository();
     $gb = $countryRepo->loadByTwoCharCode("GB");
     $siteRepo = new \repositories\SiteRepository();
     $site = $siteRepo->loadById($this->app['config']->singleSiteID);
     // TODO assumes single site!
     $areaMapItInfoRepo = new \com\meetyournextmp\repositories\AreaMapItInfoRepository();
     $humanPopItInfoRepo = new \com\meetyournextmp\repositories\HumanPopItInfoRepository();
     $humanRepo = new HumanRepository();
     $areaRepo = new \repositories\AreaRepository();
     while ($morePages) {
         ++$page;
         $this->logVerbose("Getting page " . $page);
         $ch = curl_init();
         curl_setopt($ch, CURLOPT_URL, $url . $page);
         curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
         curl_setopt($ch, CURLOPT_USERAGENT, 'Meet Your Next MP');
         $data = curl_exec($ch);
         $response = curl_getinfo($ch);
         curl_close($ch);
         if ($response['http_code'] != 200) {
             return array('result' => 'error', 'errorHTTPCode' => 200);
         }
         $dataObj = json_decode($data);
         foreach ($dataObj->result as $humanObj) {
             $this->logVerbose("Human " . $humanObj->name . "  POPITID " . $humanObj->id);
             /** @var $humanPopItInfo HumanPopItInfoModel */
             $humanPopItInfo = $humanPopItInfoRepo->getByPopItID($humanObj->id);
             $human = null;
             $standing = false;
             if (isset($humanObj->standing_in)) {
                 $standingIn = get_object_vars($humanObj->standing_in);
                 $standingIn2015 = null;
                 if (isset($standingIn['2015'])) {
                     $standingIn2015 = get_object_vars($standingIn['2015']);
                     $standing = true;
                 }
                 $partyMemberships = isset($humanObj->party_memberships) ? get_object_vars($humanObj->party_memberships) : array();
                 $partyMemberships2015 = null;
                 if (isset($partyMemberships['2015'])) {
                     $partyMemberships2015 = get_object_vars($partyMemberships['2015']);
                 }
             }
             if ($standing) {
                 $facebook = null;
                 $twitter = null;
                 $imageURL = null;
                 $imageProxyURL = null;
                 $imageHumanURL = null;
                 if (isset($humanObj->links)) {
                     foreach ($humanObj->links as $linkData) {
                         $linkDataArray = get_object_vars($linkData);
                         if ($linkDataArray['note'] == 'facebook page') {
                             $facebook = $linkDataArray['url'];
                         }
                     }
                 }
                 if (isset($humanObj->contact_details)) {
                     foreach ($humanObj->contact_details as $linkData) {
                         $linkDataArray = get_object_vars($linkData);
                         if ($linkDataArray['type'] == 'twitter') {
                             $twitter = $linkDataArray['value'];
                         }
                     }
                 }
                 if (isset($humanObj->images)) {
                     foreach ($humanObj->images as $imageData) {
                         $imageDataArray = get_object_vars($imageData);
                         $imageProxyURL = $imageDataArray['proxy_url'] . '/300/0';
                         $imageURL = $imageDataArray['url'];
                         $imageHumanURL = $imageProxyURL ? $imageProxyURL : $imageURL;
                     }
                 }
                 $this->logVerbose(" - Standing in 2015!");
                 $description = "Standing in " . $standingIn2015['name'] . " for " . $partyMemberships2015['name'] . ".";
                 $humanUrl = "https://yournextmp.com/person/" . $humanObj->id;
                 $bits = explode('/', $standingIn2015['mapit_url']);
                 $mapItID = $bits[4];
                 if ($humanPopItInfo) {
                     $this->logVerbose(" - Found existing record");
                     $human = $humanRepo->loadById($humanPopItInfo->getHumanId());
                     if ($human->getIsDeleted()) {
                         $this->logVerbose(" - Undeleting existing Human record");
                         $humanRepo->undelete($human);
                     }
                     if ($human->getTitle() != $humanObj->name || $description != $human->getDescription() || $human->getEmail() != $humanObj->email || $human->getUrl() != $humanUrl || $human->getTwitter() != $twitter || $human->getParty() != $partyMemberships2015['name'] || $human->getImageUrl() != $imageHumanURL) {
                         $this->logVerbose(" - Updating existing Human record");
                         $human->setTitle($humanObj->name);
                         $human->setDescription($description);
                         $human->setEmail($humanObj->email);
                         $human->setTwitter($twitter);
                         $human->setParty($partyMemberships2015['name']);
                         $human->setImageUrl($imageHumanURL);
                         $human->setUrl($humanUrl);
                         $humanRepo->edit($human);
                     }
                     $humanPopItInfo->setMapitId($mapItID);
                     $humanPopItInfo->setName($humanObj->name);
                     if (isset($humanObj->gender)) {
                         $humanPopItInfo->setGenderFromString($humanObj->gender);
                     }
                     if (isset($humanObj->email)) {
                         $humanPopItInfo->setEmail($humanObj->email);
                     }
                     $humanPopItInfo->setParty($partyMemberships2015['name']);
                     // TODO if we reenable this we need to make sure it works for "YYYY" format to.
                     //if (isset($humanObj->birth_date)) {
                     //	$humanPopItInfo->setBirthDate($humanObj->birth_date);
                     //}
                     $humanPopItInfo->setFacebook($facebook);
                     $humanPopItInfo->setTwitter($twitter);
                     $humanPopItInfo->setImageUrl($imageURL);
                     $humanPopItInfo->setImageProxyUrl($imageProxyURL);
                     $humanPopItInfoRepo->edit($humanPopItInfo);
                 } else {
                     $this->logVerbose(" - Adding new record");
                     $human = new \com\meetyournextmp\models\HumanModel();
                     $human->setTitle($humanObj->name);
                     $human->setDescription($description);
                     $human->setEmail($humanObj->email);
                     $human->setTwitter($twitter);
                     $human->setImageUrl($imageHumanURL);
                     $human->setUrl($humanUrl);
                     $human->setParty($partyMemberships2015['name']);
                     $humanRepo->create($human, $site);
                     $humanPopItInfo = new \com\meetyournextmp\models\HumanPopItInfoModel();
                     $humanPopItInfo->setHumanId($human->getId());
                     $humanPopItInfo->setPopitId($humanObj->id);
                     $humanPopItInfo->setMapitId($mapItID);
                     $humanPopItInfo->setName($humanObj->name);
                     if (isset($humanObj->gender)) {
                         $humanPopItInfo->setGenderFromString($humanObj->gender);
                     }
                     if (isset($humanObj->email)) {
                         $humanPopItInfo->setEmail($humanObj->email);
                     }
                     $humanPopItInfo->setParty($partyMemberships2015['name']);
                     // TODO if we reenable this we need to make sure it works for "YYYY" format to.
                     //if (isset($humanObj->birth_date)) {
                     //	$humanPopItInfo->setBirthDate($humanObj->birth_date);
                     //}
                     $humanPopItInfo->setFacebook($facebook);
                     $humanPopItInfo->setTwitter($twitter);
                     $humanPopItInfo->setImageUrl($imageURL);
                     $humanPopItInfo->setImageProxyUrl($imageProxyURL);
                     $humanPopItInfoRepo->create($humanPopItInfo);
                 }
                 $areaMapItInfo = $areaMapItInfoRepo->getByMapItID($humanPopItInfo->getMapitId());
                 if ($areaMapItInfo) {
                     $area = $areaRepo->loadById($areaMapItInfo->getAreaId());
                     if ($area) {
                         $humanRepo->addHumanToArea($human, $area);
                         $humanRepo->removeHumanFromAllButOneArea($human, $area);
                     }
                 }
             } else {
                 $this->logVerbose(" - NOT Standing in 2015!");
                 if ($humanPopItInfo) {
                     $human = $humanRepo->loadById($humanPopItInfo->getHumanId());
                     if ($human && !$human->getIsDeleted()) {
                         $this->logVerbose(" - Deleteing ");
                         $humanRepo->delete($human);
                     }
                 }
             }
             // Next Task - have any humans been merged into this one?
             foreach ($humanObj->versions as $humanVersion) {
                 $idOfOldRecord = $humanVersion->data->id;
                 if ($idOfOldRecord != $humanObj->id) {
                     $this->logVerbose(" - found a record that was merged into this one: " . $idOfOldRecord);
                     $humanPopItInfoOfOldRecord = $humanPopItInfoRepo->getByPopItID($idOfOldRecord);
                     if ($humanPopItInfoOfOldRecord) {
                         $this->logVerbose(" - found HumanPopIt for old record ");
                         $humanOfOldRecord = $humanRepo->loadById($humanPopItInfoOfOldRecord->getHumanId());
                         if ($humanOfOldRecord) {
                             $this->logVerbose(" - found Human for old record");
                             if (!$humanOfOldRecord->getIsDeleted()) {
                                 if ($human) {
                                     $this->logVerbose(" - marking duplicate human of old record ");
                                     $humanRepo->markDuplicate($humanOfOldRecord, $human);
                                 } else {
                                     $this->logVerbose(" - deleting human of old record");
                                     $humanRepo->delete($humanOfOldRecord);
                                 }
                             } else {
                                 $this->logVerbose(" - human for old record already deleted");
                             }
                         }
                     }
                 }
             }
         }
         $morePages = $dataObj->has_more;
     }
     return array('result' => 'ok');
 }
print "Actually SEND: " . ($actuallySEND ? "YES" : "nah") . "\n";
if (!$actuallySEND) {
    die("DIE\n");
}
// setup
$siteRepo = new \repositories\SiteRepository();
$site = $siteRepo->loadById($CONFIG->singleSiteID);
configureAppForSite($site);
for ($i = 1; $i <= 10; $i++) {
    // Get Human
    $stat = $DB->prepare("SELECT human_information.* FROM human_information " . " LEFT JOIN human_email ON human_email.human_id = human_information.id AND human_email.created_at > '2015-04-10 00:00:00'" . " JOIN human_in_area ON human_in_area.human_id = human_information.id " . " JOIN area_information ON area_information.id = human_in_area.area_id " . " WHERE  human_information.is_deleted = '0' AND " . " human_information.email IS NOT NULL AND human_information.email != '' AND human_email.id IS NULL" . " LIMIT 1");
    $stat->execute();
    if ($stat->rowCount() == 0) {
        die("No Human Data");
    }
    $human = new \com\meetyournextmp\models\HumanModel();
    $human->setFromDataBaseRow($stat->fetch());
    // Get Area
    $stat = $DB->prepare("SELECT area_information.* FROM area_information " . " JOIN human_in_area ON human_in_area.area_id = area_information.id AND human_in_area.human_id = :human_id");
    $stat->execute(array('human_id' => $human->getId()));
    $stat->execute();
    if ($stat->rowCount() == 0) {
        die("No Area Data");
    }
    $area = new \models\AreaModel();
    $area->setFromDataBaseRow($stat->fetch());
    // make email
    $email = new \com\meetyournextmp\models\HumanEmailModel();
    $email->setFromAppAndHumanAndArea($app, $human, $area);
    // save email
    $repo = new \com\meetyournextmp\repositories\HumanEmailRepository();
 function testEventInNoAreaHumanInCentre()
 {
     $this->addCountriesToTestDB();
     TimeSource::mock(2014, 5, 1, 7, 0, 0);
     $user = new UserAccountModel();
     $user->setEmail("*****@*****.**");
     $user->setUsername("test");
     $user->setPassword("password");
     $userWatching = new UserAccountModel();
     $userWatching->setEmail("*****@*****.**");
     $userWatching->setUsername("test1");
     $userWatching->setPassword("password");
     $userRepo = new UserAccountRepository();
     $userRepo->create($user);
     $userRepo->create($userWatching);
     $site = new SiteModel();
     $site->setTitle("Test");
     $site->setSlug("test");
     $siteRepo = new SiteRepository();
     $siteRepo->create($site, $user, array(), $this->getSiteQuotaUsedForTesting());
     $countryRepo = new \repositories\CountryRepository();
     $gb = $countryRepo->loadByTwoCharCode("GB");
     $areaParent = new \models\AreaModel();
     $areaParent->setTitle("Parent");
     $areaChild = new \models\AreaModel();
     $areaChild->setTitle("Child");
     $areaOtherChild = new \models\AreaModel();
     $areaOtherChild->setTitle("Other Child");
     $areaRepo = new \repositories\AreaRepository();
     $areaRepo->create($areaParent, null, $site, $gb);
     $areaRepo->create($areaChild, $areaParent, $site, $gb);
     $areaRepo->create($areaOtherChild, $areaParent, $site, $gb);
     $areaRepo->buildCacheAreaHasParent($areaParent);
     $areaRepo->buildCacheAreaHasParent($areaChild);
     $areaRepo->buildCacheAreaHasParent($areaOtherChild);
     $event = new EventModel();
     $event->setSummary("test");
     $event->setDescription("test test");
     $event->setStartAt($this->mktime(2014, 5, 10, 19, 0, 0, 'Europe/London'));
     $event->setEndAt($this->mktime(2014, 5, 10, 21, 0, 0, 'Europe/London'));
     $event->setUrl("http://www.info.com");
     $event->setTicketUrl("http://www.tickets.com");
     $eventRepository = new EventRepository();
     $eventRepository->create($event, $site, $user);
     $human = new \com\meetyournextmp\models\HumanModel();
     $human->setTitle("Bob");
     $humanRepo = new \com\meetyournextmp\repositories\HumanRepository();
     $humanRepo->create($human, $site, null);
     $humanRepo->addHumanToArea($human, $areaChild, null);
     $humanRepo->addHumanToEvent($human, $event, null);
     $userWatchesAreaRepo = new \repositories\UserWatchesAreaRepository();
     //////////////////////////////// TEST ALL EVENTS
     $erb = new \repositories\builders\EventRepositoryBuilder();
     $events = $erb->fetchAll();
     $this->assertEquals(1, count($events));
     $hrb = new \repositories\builders\HistoryRepositoryBuilder();
     $hrb->setIncludeAreaHistory(false);
     $hrb->setIncludeEventHistory(true);
     $histories = $hrb->fetchAll();
     $this->assertEquals(1, count($histories));
     //////////////////////////////// TEST OTHER CHILD
     $erb = new \repositories\builders\EventRepositoryBuilder();
     $erb->setArea($areaOtherChild);
     $events = $erb->fetchAll();
     $this->assertEquals(0, count($events));
     $hrb = new \repositories\builders\HistoryRepositoryBuilder();
     $hrb->getHistoryRepositoryBuilderConfig()->setArea($areaOtherChild);
     $hrb->setIncludeAreaHistory(false);
     $hrb->setIncludeEventHistory(true);
     $histories = $hrb->fetchAll();
     $this->assertEquals(0, count($histories));
     //////////////////////////////// TEST CHILD
     $erb = new \repositories\builders\EventRepositoryBuilder();
     $erb->setArea($areaChild);
     $events = $erb->fetchAll();
     $this->assertEquals(1, count($events));
     $hrb = new \repositories\builders\HistoryRepositoryBuilder();
     $hrb->getHistoryRepositoryBuilderConfig()->setArea($areaChild);
     $hrb->setIncludeAreaHistory(false);
     $hrb->setIncludeEventHistory(true);
     $histories = $hrb->fetchAll();
     $this->assertEquals(1, count($histories));
     //////////////////////////////// TEST PARENT
     $erb = new \repositories\builders\EventRepositoryBuilder();
     $erb->setArea($areaChild);
     $events = $erb->fetchAll();
     $this->assertEquals(1, count($events));
     $hrb = new \repositories\builders\HistoryRepositoryBuilder();
     $hrb->getHistoryRepositoryBuilderConfig()->setArea($areaChild);
     $hrb->setIncludeAreaHistory(false);
     $hrb->setIncludeEventHistory(true);
     $histories = $hrb->fetchAll();
     $this->assertEquals(1, count($histories));
     //////////////////////////////// USER WATCHES NOTHING
     $erb = new \repositories\builders\EventRepositoryBuilder();
     $erb->setUserAccount($userWatching, false, true, true, true);
     $events = $erb->fetchAll();
     $this->assertEquals(0, count($events));
     //////////////////////////////// USER WATCHES PARENT
     $userWatchesAreaRepo->startUserWatchingArea($userWatching, $areaParent);
     $erb = new \repositories\builders\EventRepositoryBuilder();
     $erb->setUserAccount($userWatching, false, true, true, true);
     $events = $erb->fetchAll();
     $this->assertEquals(1, count($events));
     //////////////////////////////// USER WATCHES CHILD
     $userWatchesAreaRepo->stopUserWatchingArea($userWatching, $areaParent);
     $userWatchesAreaRepo->startUserWatchingArea($userWatching, $areaChild);
     $erb = new \repositories\builders\EventRepositoryBuilder();
     $erb->setUserAccount($userWatching, false, true, true, true);
     $events = $erb->fetchAll();
     $this->assertEquals(1, count($events));
 }