<?php
namespace App\Calendar\Controller;
use App\Auction\Manager\AuctionManager;
use App\Calendar\Calendar;
use App\Calendar\Form\Type\CalendarFilterType;
use App\EventMap\EventMap;
use App\Profile\Model\Profile;
use App\Race\Manager\RaceManager;
use Carbon\CarbonImmutable;
use Doctrine\DBAL\Query\QueryBuilder;
use Pimcore\Controller\FrontendController;
use Pimcore\Model\DataObject\Raceday;
use Pimcore\Model\DataObject\Racingtrack;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
class CalendarController extends FrontendController
{
/**
* Calendar Page.
*
* @return Response
*/
public function detail(
Request $request,
Calendar $calendar,
AuctionManager $auctionManager,
RaceManager $raceManager,
EventMap $eventMap
) {
// Setup Options from Request
$date = $request->query->get('date');
$year = $date['year'] ?? date('Y');
$month = $date['month'] ?? date('m');
$topic = $request->get('topic', 'auctions');
$selectedMonth = CarbonImmutable::create($year, $month);
$race = $request->get('race', null);
$period = CarbonImmutable::create($year, $month) > CarbonImmutable::now() ? 'future' : 'past';
$country = $race ? $race['country'] : null;
$surface = $race ? $race['surface'] : null;
$direction = $race ? $race['direction'] : null;
$racingtrack = $race ? $race['racingtrack'] : null;
$auction = $request->get('auction', null);
$auctionhouse = $auction ? $auction['auctionhouse'] : null;
$auctionType = $auction ? $auction['type'] : null;
// Generate Events from Auctions & Races
$events = [];
if ('racedays' == $topic) {
// $events = $raceManager->getRacesByMonthGroupedByDate($selectedMonth);
$events = Raceday::getList();
$events->setCondition(
'(date BETWEEN :firstDay AND :lastDay)',
[
'firstDay' => $selectedMonth->firstOfMonth(),
'lastDay' => $selectedMonth->lastOfMonth(),
]
);
$events->setOrderKey('date');
$racetracks = Profile::getList();
$racetracks->onCreateQueryBuilder(function (QueryBuilder $queryBuilder) {
$queryBuilder->join('object_profile', 'object_brick_query_RacetrackProfile_profile', 'racingtrack', 'object_profile.oo_id = racingtrack.o_id');
});
if ($racingtrack) {
$racetracks->addConditionParam('oo_id = :id', ['id' => $racingtrack]);
}
if ($surface) {
$racetracks->addConditionParam('surface = :surface', ['surface' => $surface]);
}
if ($direction) {
$racetracks->addConditionParam('direction = :direction', ['direction' => $direction]);
}
if ($country) {
$racetracks->addConditionParam('country = :country', ['country' => $country]);
}
$events->addConditionParam('racingtrack__id IN (:id)', ['id' => $racetracks->loadIdList()]);
$events = $events->load();
} elseif ('races' === $topic) {
$events = $raceManager->getRacesByMonthGroupedByDate($selectedMonth);
// $events = array_filter($events, function($race) {
// return $race->getCountry() == $country && $race->getSurface() == $surface && $race->getDirection() == $direction && $race->getRacetrack() == $racetrack;
// } );
$racetracks = Racingtrack::getList();
if ($racingtrack) {
$racetracks->addConditionParam('oo_id = :id', ['id' => $racingtrack]);
}
if ($surface) {
$racetracks->addConditionParam('surface = :surface', ['surface' => $surface]);
}
if ($direction) {
$racetracks->addConditionParam('direction = :direction', ['direction' => $direction]);
}
if ($country) {
$racetracks->addConditionParam('country = :country', ['country' => $country]);
}
$events->addConditionParam('racingtrack__id IN (:id)', ['id' => $racetracks->loadIdList()]);
$events = $events->load();
} elseif ('auctions' === $topic) {
$events = $auctionManager->getAuctionsByMonth($selectedMonth);
if ($auctionhouse) {
$events->addConditionParam('auctionhouse__id = :id', ['id' => $auctionhouse]);
// dd([$auctionhouse, $events, $events->load()]);
}
if ($auctionType) {
$events->addConditionParam('auctionType = :type', ['type' => $auctionType]);
}
$events = $events->load();
}
// Setup Calendar
$calendar->setMonth($selectedMonth);
$calendar->generateEvents($events);
$weeks = $calendar->getWeeksWithEvents();
$days = $calendar->getDaysWithEvents();
// Create Filter for Calendar & Map
$filter = $this->createForm(CalendarFilterType::class, [
'date' => $selectedMonth,
'topic' => $topic,
], [
'method' => 'GET',
'period' => $period,
'surface' => $surface,
'direction' => $direction,
'country' => $country,
'racingtrack' => $racingtrack,
'auctionhouse' => $auctionhouse,
'auctionType' => $auctionType,
]);
// Generate Marker for Events
$marker = $eventMap->generateMarker($events);
return $this->renderForm('document/calendar.html.twig', [
'topic' => $topic,
'month' => $selectedMonth,
'weeks' => $weeks,
'days' => $days,
'filter' => $filter,
'marker' => $marker,
]);
}
}