<?php
namespace App\EventSubscriber;
use App\Entity\City;
use App\Entity\Photo;
use App\Entity\Coach;
use App\Entity\Client;
use App\Entity\Country;
use App\Entity\HealthIndicator;
use App\Entity\MeasurementItem;
use App\Entity\SubgoalItem;
use App\Entity\ClientInvoice;
use App\Entity\FoodPeriod;
use App\Entity\FoodDiary;
use App\Entity\Training;
use EasyCorp\Bundle\EasyAdminBundle\Event\BeforeEntityPersistedEvent;
use EasyCorp\Bundle\EasyAdminBundle\Event\AfterEntityPersistedEvent;
use EasyCorp\Bundle\EasyAdminBundle\Event\BeforeEntityUpdatedEvent;
use EasyCorp\Bundle\EasyAdminBundle\Event\BeforeEntityDeletedEvent;
use EasyCorp\Bundle\EasyAdminBundle\Event\AfterEntityDeletedEvent;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use App\Helper\UniqueEntityProperty;
use App\Helper\AvatarManager;
use App\Helper\CoachInvoiceCreator;
use App\Helper\FoodPeriodSetter;
use App\Helper\FoodPeriodManager;
use App\Helper\TrainingManager;
use App\Helper\CoachManager;
use App\Helper\ClientManager;
class EasyAdminSubscriber implements EventSubscriberInterface
{
private $uniqueEntityProperty;
private $avatarManager;
private $coachInvoiceCreator;
private $foodPeriodSetter;
private $foodPeriodManager;
private $trainingManager;
private $coachManager;
private $clientManager;
public function __construct(
UniqueEntityProperty $uniqueEntityProperty,
AvatarManager $avatarManager,
CoachInvoiceCreator $coachInvoiceCreator,
FoodPeriodSetter $foodPeriodSetter,
FoodPeriodManager $foodPeriodManager,
TrainingManager $trainingManager,
CoachManager $coachManager,
ClientManager $clientManager
)
{
$this->uniqueEntityProperty = $uniqueEntityProperty;
$this->avatarManager = $avatarManager;
$this->coachInvoiceCreator = $coachInvoiceCreator;
$this->foodPeriodSetter = $foodPeriodSetter;
$this->foodPeriodManager = $foodPeriodManager;
$this->trainingManager = $trainingManager;
$this->coachManager = $coachManager;
$this->clientManager = $clientManager;
}
public static function getSubscribedEvents()
{
return [
BeforeEntityPersistedEvent::class => ['beforePersisted'],
BeforeEntityUpdatedEvent::class => ['beforeUpdated'],
AfterEntityPersistedEvent::class => ['afterPersisted'],
BeforeEntityDeletedEvent::class => ['beforeDeleted'],
];
}
public function beforeDeleted(BeforeEntityDeletedEvent $event) {
$this->removeTrainingFromClientsAndCoach($event);
$this->removeCoachFromClients($event);
$this->removePeriodFromDiaries($event);
$this->removeClientFromCoaches($event);
}
public function beforeUpdated(BeforeEntityUpdatedEvent $event) {
$this->setTrainingComplete($event);
$this->addTrainingToClient($event);
$this->addCoachToClients($event);
$this->addClientsToCoach($event);
$this->setFoodDiaryPeriod($event);
}
public function beforePersisted(BeforeEntityPersistedEvent $event) {
$this->setAvatar($event);
$this->setUniqueProperty($event);
$this->addTrainingToClient($event);
$this->addActiveTrainingToCoach($event);
$this->addCoachToClients($event);
$this->addClientsToCoach($event);
}
public function afterPersisted(AfterEntityPersistedEvent $event) {
$this->createCoachInvoice($event);
}
public function removePeriodFromDiaries($event)
{
$entity = $event->getEntityInstance();
if ($entity instanceof FoodPeriod) {
$this->foodPeriodManager->removeFromDiaries($entity);
}
}
public function addClientsToCoach($event)
{
$entity = $event->getEntityInstance();
if ($entity instanceof Training) {
$this->clientManager->addClientToCoach($entity);
}
}
public function removeClientFromCoaches($event)
{
$entity = $event->getEntityInstance();
if (!$entity instanceof Client) {
return;
}
$this->clientManager->removeClientFromCoaches($entity);
}
public function removeCoachFromClients($event)
{
$entity = $event->getEntityInstance();
if ($entity instanceof Training) {
$this->coachManager->removeCarefullyCoachFromClients($entity);
} elseif ($entity instanceof Coach) {
$this->coachManager->removeCoachFromClients($entity);
}
}
public function addCoachToClients($event)
{
$entity = $event->getEntityInstance();
if ($entity instanceof Training) {
$this->coachManager->addCoachToClients($entity);
}
}
public function removeTrainingFromClientsAndCoach($event)
{
$entity = $event->getEntityInstance();
if ($entity instanceof Training) {
$this->trainingManager->removeFromClient($entity);
$this->trainingManager->removeActiveFromCoach($entity);
$this->trainingManager->removeCompletedFromCoach($entity);
}
}
public function addActiveTrainingToCoach($event)
{
$entity = $event->getEntityInstance();
if ($entity instanceof Training) {
$this->trainingManager->addActiveToCoach($entity);
}
}
public function addTrainingToClient($event)
{
$entity = $event->getEntityInstance();
if ($entity instanceof Training) {
$this->trainingManager->addToClient($entity);
}
}
public function setTrainingComplete($event)
{
$entity = $event->getEntityInstance();
if (!$entity instanceof Training) {
return;
}
// no trainings
$list = $entity->getList();
if (!$list) {
return;
}
foreach ($list as $training) {
if ($training['complete']) {
continue;
}
// incomplete training
$entity->setComplete(false);
// remove completed training from clients and coach
$this->trainingManager->removeCompletedFromClients($entity);
$this->trainingManager->removeCompletedFromCoach($entity);
$this->trainingManager->addActiveToCoach($entity);
return;
}
// complete training pack
$entity->setComplete();
// add completed training to clients and coach
$this->trainingManager->addCompletedToClients($entity);
$this->trainingManager->addCompletedToCoach($entity);
$this->trainingManager->removeActiveFromCoach($entity);
}
public function setFoodDiaryPeriod($event)
{
$entity = $event->getEntityInstance();
if ($entity instanceof FoodDiary) {
$trainingPack = $this->foodPeriodSetter->set($entity->getPhotos());
$entity->setPhotos($trainingPack);
}
}
public function setAvatar(BeforeEntityPersistedEvent $event)
{
$entity = $event->getEntityInstance();
// avatar for coach
if ($entity instanceof Coach) {
// $entity->setAvatar = $this->avatarManager->getPhoto($entity->getAvatarFile());
// name for country
} elseif ($entity instanceof Client) {
// $name = $this->uniqueEntityProperty->getUniqueName($entity->getTitle(), Country::class);
// $entity->setName($name);
// name for health indicator
}
}
public function setUniqueProperty(BeforeEntityPersistedEvent $event)
{
$entity = $event->getEntityInstance();
// name for city
if ($entity instanceof City) {
$name = $this->uniqueEntityProperty->getUniqueName($entity->getTitle(), City::class);
$entity->setName($name);
// name for country
} elseif ($entity instanceof Country) {
$name = $this->uniqueEntityProperty->getUniqueName($entity->getTitle(), Country::class);
$entity->setName($name);
// name for health indicator
} elseif ($entity instanceof HealthIndicator) {
$name = $this->uniqueEntityProperty->getUniqueName( str_replace(' ', '_', $entity->getTitle()), HealthIndicator::class );
$entity->setName($name);
// name for measurment item
} elseif ($entity instanceof MeasurementItem) {
$name = $this->uniqueEntityProperty->getUniqueName( str_replace(' ', '_', $entity->getTitle()), MeasurementItem::class );
$entity->setName($name);
// name for subgoal item
} elseif ($entity instanceof SubgoalItem) {
$name = $this->uniqueEntityProperty->getUniqueName( str_replace(' ', '_', $entity->getTitle()), SubgoalItem::class );
$entity->setName($name);
// name for food period
} elseif ($entity instanceof FoodPeriod) {
$name = $this->uniqueEntityProperty->getUniqueName( str_replace(' ', '_', $entity->getTitle()), FoodPeriod::class );
$entity->setName($name);
}
}
public function createCoachInvoice(AfterEntityPersistedEvent $event) {
$entity = $event->getEntityInstance();
// name for city
if ($entity instanceof ClientInvoice) {
// create new invoice for coach
$this->coachInvoiceCreator->do($entity);
}
}
}