/**
  * @param ReservationSeries $reservationSeries
  * @return ReservationRuleResult
  */
 public function Validate($reservationSeries)
 {
     $conflicts = array();
     $reservationAccessories = $reservationSeries->Accessories();
     if (count($reservationAccessories) == 0) {
         // no accessories to be reserved, no need to proceed
         return new ReservationRuleResult();
     }
     /** @var AccessoryToCheck[] $accessories  */
     $accessories = array();
     foreach ($reservationAccessories as $accessory) {
         $a = $this->accessoryRepository->LoadById($accessory->AccessoryId);
         if (!$a->HasUnlimitedQuantity()) {
             $accessories[$a->GetId()] = new AccessoryToCheck($a, $accessory);
         }
     }
     if (count($accessories) == 0) {
         // no accessories with limited quantity to be reserved, no need to proceed
         return new ReservationRuleResult();
     }
     $reservations = $reservationSeries->Instances();
     /** @var Reservation $reservation */
     foreach ($reservations as $reservation) {
         Log::Debug("Checking for accessory conflicts, reference number %s", $reservation->ReferenceNumber());
         $accessoryReservations = $this->reservationRepository->GetAccessoriesWithin($reservation->Duration());
         $aggregation = new AccessoryAggregation($accessories, $reservation->Duration());
         foreach ($accessoryReservations as $accessoryReservation) {
             if ($reservation->ReferenceNumber() != $accessoryReservation->GetReferenceNumber()) {
                 $aggregation->Add($accessoryReservation);
             }
         }
         foreach ($accessories as $accessory) {
             $alreadyReserved = $aggregation->GetQuantity($accessory->GetId());
             $requested = $accessory->QuantityReserved();
             if ($requested + $alreadyReserved > $accessory->QuantityAvailable()) {
                 Log::Debug("Accessory over limit. Reference Number %s, Date %s, Quantity already reserved %s, Quantity requested: %s", $reservation->ReferenceNumber(), $reservation->Duration(), $alreadyReserved, $requested);
                 array_push($conflicts, array('name' => $accessory->GetName(), 'date' => $reservation->StartDate()));
             }
         }
     }
     $thereAreConflicts = count($conflicts) > 0;
     if ($thereAreConflicts) {
         return new ReservationRuleResult(false, $this->GetErrorString($conflicts));
     }
     return new ReservationRuleResult();
 }