/**
  * Attempt to add speakers to the presentation by fuzzy matching the FirstName / Surname
  * @param Presentation $p
  * @param VideoPresentation $v
  */
 private function addLegacySpeakers(Presentation $p, VideoPresentation $v)
 {
     $speakers = explode(',', $v->Speakers);
     $created = 0;
     $resolved = 0;
     $found = 0;
     foreach ($speakers as $speakerName) {
         $speakerName = trim($speakerName);
         $speakerName = preg_replace('/\\s\\s+/', ' ', $speakerName);
         $speaker = PresentationSpeaker::get()->where("CONCAT(FirstName, ' ', LastName) = '" . Convert::raw2sql($speakerName) . "'");
         if (!$speaker->exists()) {
             $names = explode(' ', $speakerName);
             $firstName = array_shift($names);
             $lastName = implode(' ', $names);
             $speaker = PresentationSpeaker::create(['FirstName' => $firstName, 'LastName' => $lastName, 'Notes' => '[LEGACY]']);
             $speaker->write();
             $p->Speakers()->add($speaker);
             echo "Created legacy speaker {$speaker->getName()} from {$speakerName}" . $this->br();
             $created++;
         } else {
             if ($speaker->count() > 1) {
                 echo "Found more than one speaker matching \"{$speakerName}\": " . implode(',', $speaker->column('ID')) . $this->br();
                 $bestCandidate = null;
                 $highScore = 0;
                 foreach ($speaker as $s) {
                     $numSpeakings = DB::query("SELECT COUNT(*) FROM `Presentation_Speakers` WHERE PresentationSpeakerID = {$s->ID}")->value();
                     $hasMember = (int) $s->Member()->exists();
                     $score = $numSpeakings + $hasMember;
                     if ($score > $highScore) {
                         $highScore = $score;
                         $bestCandidate = $s;
                     }
                 }
                 if ($bestCandidate) {
                     echo "Found best candidate #{$bestCandidate->ID} with a score of {$highScore}" . $this->br();
                     $p->Speakers()->add($bestCandidate);
                     $resolved++;
                 } else {
                     $this->addError("No speakings or MemberIDs for " . implode(',', $speaker->map('ID', 'Name')->toArray()) . " on \"{$p->Title}\"");
                 }
             } else {
                 $p->Speakers()->add($speaker->first());
                 echo "Added speaker " . $speaker->first()->getName() . $this->br();
                 $found++;
             }
         }
     }
     $this->stats['Speakers created'] += $created;
     $this->stats['Speakers resolved'] += $resolved;
     $this->stats['Speakers found'] += $found;
     return $p;
 }