<?php
namespace App\Entity;
use App\Repository\POIRepository;
use DateTime;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\DBAL\Types\Types;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;
use Vich\UploaderBundle\Mapping\Annotation as Vich;
use Symfony\Component\HttpFoundation\File\File;
use JMS\Serializer\Annotation as Serializer;
use JMS\Serializer\Annotation\MaxDepth;
#[ORM\Entity(repositoryClass: POIRepository::class)]
#[ORM\HasLifecycleCallbacks]
class POI
{
#[ORM\Id]
#[ORM\GeneratedValue]
#[ORM\Column]
#[Serializer\Groups(["category","poi","tour"])]
private ?int $id = null;
#[ORM\Column(length: 512, nullable: true)]
#[Serializer\Groups(["poi"])]
#[Serializer\SerializedName("previewImageUrl")]
private ?string $preview_image_url = null;
#[ORM\Column(type: Types::DECIMAL, precision: 30, scale: 24, nullable: true)]
#[Serializer\Groups(["poi"])]
private ?string $longitude = null;
#[ORM\Column(type: Types::DECIMAL, precision: 30, scale: 24, nullable: true)]
#[Serializer\Groups(["poi"])]
private ?string $latidtude = null;
#[ORM\Column(nullable: true)]
#[Serializer\Groups(["poi"])]
#[Serializer\SerializedName("visitedCompletionDistance")]
private ?int $visited_completion_distance = null;
#[ORM\Column(nullable: true)]
#[Serializer\Groups(["poi"])]
#[Serializer\SerializedName("activationDistance")]
private ?int $activation_distance = null;
#[ORM\Column(nullable: true)]
#[Serializer\Groups(["poi"])]
#[Serializer\SerializedName("notificationDistance")]
private ?int $notification_distance = null;
#[ORM\Column(length: 1024, nullable: true)]
#[Serializer\Groups(["poi"])]
#[Serializer\SerializedName("notificationText")]
private ?string $notification_text = null;
#[ORM\Column(length: 2048, nullable: true)]
#[Serializer\Groups(["poi"])]
#[Serializer\SerializedName("guideTextEntry")]
private ?string $guide_text_entry = null;
#[ORM\Column(length: 255, nullable: true)]
#[Serializer\Groups(["poi"])]
#[Serializer\SerializedName("audioGuideTextEntryUrl")]
private ?string $audio_guide_text_entry_url = null;
#[ORM\Column(length: 2048, nullable: true)]
#[Serializer\Groups(["poi"])]
#[Serializer\SerializedName("guideTextExit")]
private ?string $guide_text_exit = null;
#[ORM\Column(length: 255, nullable: true)]
#[Serializer\Groups(["poi"])]
#[Serializer\SerializedName("audioGuideTextExitUrl")]
private ?string $audio_guide_text_exit_url = null;
#[ORM\Column(length: 255, nullable: true)]
#[Serializer\Groups(["poi"])]
#[Serializer\SerializedName("custom3DModelUrl")]
private ?string $custom_3D_model_url = null;
#[ORM\Column(type: Types::ARRAY, nullable: true)]
#[Serializer\Groups(["poi"])]
#[Serializer\SerializedName("completionCondition")]
private array $completion_condition = [];
//#[ORM\ManyToMany(targetEntity: Category::class, mappedBy: 'pois')]
//private Collection $categories;
#[ORM\OneToMany(targetEntity: CategoryPoi::class, mappedBy: 'poi',cascade:["remove"])]
#[MaxDepth(1)]
private Collection $categories;
#[ORM\OneToMany(targetEntity: TourPoi::class, mappedBy: 'poi',cascade:['persist', 'remove'])]
#[MaxDepth(1)]
private Collection $tours;
#[ORM\ManyToMany(targetEntity: POIContent::class, mappedBy: 'pois',cascade:['persist', 'remove'],orphanRemoval: true)]
#[MaxDepth(2)]
#[Serializer\Groups(["poi"])]
private Collection $poicontents;
#[ORM\OneToMany(mappedBy: 'poi', targetEntity: QuizEntry::class,cascade:['persist', 'remove'])]
#[MaxDepth(3)]
#[Serializer\Groups(["poi"])]
private Collection $quizentries;
#[ORM\OneToOne(cascade: ['persist', 'remove'])]
#[MaxDepth(1)]
#[Serializer\Groups(["poi"])]
private ?AudioTextBlock $title = null;
#[ORM\OneToOne(cascade: ['persist', 'remove'])]
#[MaxDepth(1)]
#[Serializer\Groups(["poi"])]
private ?AudioTextBlock $description = null;
#[ORM\OneToOne(cascade: ['persist', 'remove'])]
#[MaxDepth(1)]
#[Serializer\Groups(["poi"])]
#[Serializer\SerializedName("shortDescription")]
private ?AudioTextBlock $short_description = null;
#[ORM\ManyToOne(cascade:["persist"])]
#[MaxDepth(1)]
#[Serializer\Groups(["poi"])]
#[Serializer\SerializedName("treasureName")]
private ?AudioTextBlock $treasure_name = null;
#[ORM\ManyToMany(targetEntity: AudioTextBlock::class,cascade: ['persist', 'remove'])]
#[ORM\JoinTable(name:"poiguideenters")]
#[MaxDepth(1)]
#[Serializer\Groups(["poi"])]
#[Serializer\SerializedName("guideTextBlocksEnter")]
private Collection $guide_text_blocks_enter;
#[ORM\ManyToMany(targetEntity: AudioTextBlock::class,cascade: ['persist', 'remove'])]
#[ORM\JoinTable(name:"poiguideexits")]
#[MaxDepth(1)]
#[Serializer\Groups(["poi"])]
#[Serializer\SerializedName("guideTextBlocksExit")]
private Collection $guide_text_blocks_exit;
#[ORM\ManyToMany(targetEntity: AudioTextBlock::class,cascade: ['persist', 'remove'])]
#[ORM\JoinTable(name:"poiguidenotificationpickups")]
#[MaxDepth(1)]
#[Serializer\Groups(["poi"])]
#[Serializer\SerializedName("guideNotificationPickup")]
private Collection $guide_notification_pickup;
#[ORM\ManyToMany(targetEntity: AudioTextBlock::class,cascade: ['persist', 'remove'])]
#[ORM\JoinTable(name:"poiguidenotifications")]
#[MaxDepth(1)]
#[Serializer\Groups(["poi"])]
#[Serializer\SerializedName("guideNotificationTexts")]
private Collection $guide_notification_texts;
#[ORM\Column(length: 255, nullable: true)]
#[Serializer\Groups(["poi"])]
private ?string $titlevalue = null;
#[ORM\Column(nullable: true)]
#[Serializer\Groups(["poi"])]
#[Serializer\SerializedName("modelOffsetX")]
private ?int $model_offset_x = null;
#[ORM\Column(nullable: true)]
#[Serializer\Groups(["poi"])]
#[Serializer\SerializedName("modelOffsetY")]
private ?int $model_offset_y = null;
#[ORM\Column(nullable: true)]
#[Serializer\Groups(["poi"])]
#[Serializer\SerializedName("modelOffsetZ")]
private ?int $model_offset_z = null;
#[ORM\Column(nullable: true)]
#[Serializer\Groups(["poi"])]
private ?bool $live = null;
#[ORM\Column(type: Types::DATETIME_MUTABLE, nullable: true)]
#[Serializer\Groups(["poi"])]
#[Serializer\SerializedName("updatedAt")]
private ?DateTime $updated_at = null;
#[ORM\Column(length: 255, nullable: true)]
#[Serializer\Groups(["poi"])]
#[Serializer\SerializedName("custom3DAndroidModelUrl")]
private ?string $custom_3D_android_model_url = null;
#[ORM\Column(length: 255, nullable: true)]
#[Serializer\Groups(["poi"])]
#[Serializer\SerializedName("custom3DIosModelUrl")]
private ?string $custom_3D_ios_model_url = null;
#[ORM\Column(length: 255, nullable: true)]
#[Serializer\Groups(["poi"])]
#[Serializer\SerializedName("videoUrl")]
#[Serializer\Type("string")]
private ?string $video_url = null;
#[Serializer\Groups(["poi"])]
#[Serializer\VirtualProperty()]
#[Serializer\SerializedName("categories")]
public function getCategoryIDs(){
$categories = $this->getCategories();
$categoryIds = [];
foreach ($categories as $category) {
$categoryIds[]=$category->getCategory()->getId();
}
return $categoryIds ;
}
#[Serializer\Groups(["poi"])]
#[Serializer\VirtualProperty()]
#[Serializer\SerializedName("tours")]
public function getTourIDs(){
$tours = $this->getTours();
$tourIDs = [];
foreach ($tours as $tour) {
$tourIDs[]=$tour->getTour()->getId();
}
return $tourIDs ;
}
private ?int $temporaryOrderValue;
public function __construct()
{
$this->categories = new ArrayCollection();
$this->tours = new ArrayCollection();
$this->poicontents = new ArrayCollection();
$this->quizentries = new ArrayCollection();
// $this->fillAudioTextblocks();
$this->guide_text_blocks_enter = new ArrayCollection();
$this->guide_text_blocks_exit = new ArrayCollection();
$this->guide_notification_texts = new ArrayCollection();
$this->guide_notification_pickup= new ArrayCollection();
}
/*
public function fillAudioTextblocks(){
$titleTextblock = new AudioTextBlock();
$this->setTitle($titleTextblock);
$descriptionTextblock = new AudioTextBlock();
$this->setDescription([$descriptionTextblock]);
$shortDescriptionBlock = new AudioTextBlock();
$this->setShortDescription([$shortDescriptionBlock]);
}
*/
public function __toString() {
return $this->title->getText();
}
public function getId(): ?int
{
return $this->id;
}
public function getTemporaryOrderValue(): ?string
{
return $this->temporaryOrderValue;
}
public function setTemporaryOrderValue(?int $temporaryOrderValue): self
{
$this->temporaryOrderValue = $temporaryOrderValue;
return $this;
}
public function getPreviewImageUrl(): ?string
{
return $this->preview_image_url;
}
public function setPreviewImageUrl(?string $preview_image_url): self
{
$this->preview_image_url = $preview_image_url;
return $this;
}
public function getTitle(): ?AudioTextBlock
{
return $this->title;
}
public function setTitle(?AudioTextBlock $title): self
{
$this->title = $title;
return $this;
}
public function getDescription(): ?AudioTextBlock
{
return $this->description;
}
public function setDescription(?AudioTextBlock $description): self
{
$this->description = $description;
return $this;
}
public function getLongitude(): ?string
{
return $this->longitude;
}
public function setLongitude(?string $longitude): self
{
$this->longitude = $longitude;
return $this;
}
public function getLatidtude(): ?string
{
return $this->latidtude;
}
public function setLatidtude(?string $latidtude): self
{
$this->latidtude = $latidtude;
return $this;
}
public function getVisitedCompletionDistance(): ?int
{
return $this->visited_completion_distance;
}
public function setVisitedCompletionDistance(?int $visited_completion_distance): self
{
$this->visited_completion_distance = $visited_completion_distance;
return $this;
}
public function getActivationDistance(): ?int
{
return $this->activation_distance;
}
public function setActivationDistance(?int $activation_distance): self
{
$this->activation_distance = $activation_distance;
return $this;
}
public function getNotificationDistance(): ?int
{
return $this->notification_distance;
}
public function setNotificationDistance(int $notification_distance): self
{
$this->notification_distance = $notification_distance;
return $this;
}
public function getNotificationText(): ?string
{
return $this->notification_text;
}
public function setNotificationText(?string $notification_text): self
{
$this->notification_text = $notification_text;
return $this;
}
public function getGuideTextEntry(): ?string
{
return $this->guide_text_entry;
}
public function setGuideTextEntry(?string $guide_text_entry): self
{
$this->guide_text_entry = $guide_text_entry;
return $this;
}
public function getAudioGuideTextEntryUrl(): ?string
{
return $this->audio_guide_text_entry_url;
}
public function setAudioGuideTextEntryUrl(?string $audio_guide_text_entry_url): self
{
$this->audio_guide_text_entry_url = $audio_guide_text_entry_url;
return $this;
}
public function getGuideTextExit(): ?string
{
return $this->guide_text_exit;
}
public function setGuideTextExit(?string $guide_text_exit): self
{
$this->guide_text_exit = $guide_text_exit;
return $this;
}
public function getAudioGuideTextExitUrl(): ?string
{
return $this->audio_guide_text_exit_url;
}
public function setAudioGuideTextExitUrl(string $audio_guide_text_exit_url): self
{
$this->audio_guide_text_exit_url = $audio_guide_text_exit_url;
return $this;
}
public function getCustom3DModelUrl(): ?string
{
return $this->custom_3D_model_url;
}
public function setCustom3DModelUrl(?string $custom_3D_model_url): self
{
$this->custom_3D_model_url = $custom_3D_model_url;
return $this;
}
public function getCompletionCondition(): array
{
return $this->completion_condition;
}
public function setCompletionCondition(?array $completion_condition): self
{
$this->completion_condition = $completion_condition;
return $this;
}
public function getCategories(): Collection
{
return $this->categories;
}
public function addCategory(Category $category): self
{
if (!$this->categories->contains($category)) {
$this->categories->add($category);
}
return $this;
}
public function removeCategoryPoi(CategoryPoi $CategoryPoi): self
{
;
if ($this->categories->removeElement($CategoryPoi)) {
$CategoryPoi->setPoi(null);
// dd("remove");
}
return $this;
}
public function removeTourPoi(TourPoi $tourPoi): self
{
if ($this->tours->removeElement($tourPoi)) {
$tourPoi->setPoi(null);
}
return $this;
}
public function removeCategory(Category $category): self
{
$this->categories->removeElement($category);
return $this;
}
/**
* @return Collection<int, Tour>
*/
public function getTours(): Collection
{
return $this->tours;
}
public function addTour(Tour $tour): self
{
dd("test");
if (!$this->tours->contains($tour)) {
$this->tours->add($tour);
}
return $this;
}
public function removeTour(Tour $tour): self
{
$this->tours->removeElement($tour);
return $this;
}
/**
* @return Collection<int, POIContent>
*/
public function getPOIContents(): Collection
{
return $this->poicontents;
}
public function addPOIContent(POIContent $pOIContent): self
{
if (!$this->poicontents->contains($pOIContent)) {
$this->poicontents->add($pOIContent);
$pOIContent->addPoi($this);
}
return $this;
}
public function removePOIContent(POIContent $pOIContent): self
{
if ($this->poicontents->removeElement($pOIContent)) {
$pOIContent->removePoi($this);
}
return $this;
}
/**
* @return Collection<int, QuizEntry>
*/
public function getQuizentries(): Collection
{
return $this->quizentries;
}
public function addQuizentry(QuizEntry $quizentry): self
{
if (!$this->quizentries->contains($quizentry)) {
$this->quizentries->add($quizentry);
$quizentry->setPoi($this);
}
return $this;
}
public function removeQuizentry(QuizEntry $quizentry): self
{
if ($this->quizentries->removeElement($quizentry)) {
// set the owning side to null (unless already changed)
if ($quizentry->getPoi() === $this) {
$quizentry->setPoi(null);
}
}
return $this;
}
/*
public function addTitle(AudioTextBlock $title): self
{
if (!$this->title->contains($title)) {
$this->title->add($title);
$title->setPOI($this);
}
return $this;
}
public function removeTitle(AudioTextBlock $title): self
{
if ($this->title->removeElement($title)) {
// set the owning side to null (unless already changed)
if ($title->getPOI() === $this) {
$title->setPOI(null);
}
}
return $this;
}
*/
public function getShortDescription(): ?AudioTextBlock
{
return $this->short_description;
}
public function setShortDescription(?AudioTextBlock $short_description): self
{
$this->short_description = $short_description;
return $this;
}
public function getTreasureName(): ?AudioTextBlock
{
return $this->treasure_name;
}
public function setTreasureName(?AudioTextBlock $treasure_name): self
{
$this->treasure_name = $treasure_name;
return $this;
}
/**
* @return Collection<int, AudioTextBlock>
*/
public function getGuideTextBlocksEnter(): Collection
{
return $this->guide_text_blocks_enter;
}
public function addGuideTextBlocksEnter(AudioTextBlock $guideTextBlocksEnter): self
{
if (!$this->guide_text_blocks_enter->contains($guideTextBlocksEnter)) {
$this->guide_text_blocks_enter->add($guideTextBlocksEnter);
}
return $this;
}
public function removeGuideTextBlocksEnter(AudioTextBlock $guideTextBlocksEnter): self
{
$this->guide_text_blocks_enter->removeElement($guideTextBlocksEnter);
return $this;
}
/**
* @return Collection<int, AudioTextBlock>
*/
public function getGuideTextBlocksExit(): Collection
{
return $this->guide_text_blocks_exit;
}
public function addGuideTextBlocksExit(AudioTextBlock $guideTextBlocksExit): self
{
if (!$this->guide_text_blocks_exit->contains($guideTextBlocksExit)) {
$this->guide_text_blocks_exit->add($guideTextBlocksExit);
}
return $this;
}
public function removeGuideTextBlocksExit(AudioTextBlock $guideTextBlocksExit): self
{
$this->guide_text_blocks_exit->removeElement($guideTextBlocksExit);
return $this;
}
/**
* @return Collection<int, AudioTextBlock>
*/
public function getGuideNotificationPickup(): Collection
{
return $this->guide_notification_pickup;
}
public function addGuideNotificationPickup(AudioTextBlock $guideNotificationPickup): self
{
if (!$this->guide_notification_pickup->contains($guideNotificationPickup)) {
$this->guide_notification_pickup->add($guideNotificationPickup);
}
return $this;
}
public function removeGuideNotificationPickup(AudioTextBlock $guideNotificationPickup): self
{
$this->guide_notification_pickup->removeElement($guideNotificationPickup);
return $this;
}
/**
* @return Collection<int, AudioTextBlock>
*/
public function getGuideNotificationTexts(): Collection
{
return $this->guide_notification_texts;
}
public function addGuideNotificationText(AudioTextBlock $guideNotificationText): self
{
if (!$this->guide_notification_texts->contains($guideNotificationText)) {
$this->guide_notification_texts->add($guideNotificationText);
}
return $this;
}
public function removeGuideNotificationText(AudioTextBlock $guideNotificationText): self
{
$this->guide_notification_texts->removeElement($guideNotificationText);
return $this;
}
public function getTitlevalue(): ?string
{
return $this->titlevalue;
}
public function setTitlevalue(?string $titlevalue): self
{
$this->titlevalue = $titlevalue;
return $this;
}
public function getModelOffsetX(): ?int
{
return $this->model_offset_x;
}
public function setModelOffsetX(?int $model_offset_x): self
{
$this->model_offset_x = $model_offset_x;
return $this;
}
public function getModelOffsetY(): ?int
{
return $this->model_offset_y;
}
public function setModelOffsetY(?int $model_offset_y): self
{
$this->model_offset_y = $model_offset_y;
return $this;
}
public function getModelOffsetZ(): ?int
{
return $this->model_offset_z;
}
public function setModelOffsetZ(?int $model_offset_z): self
{
$this->model_offset_z = $model_offset_z;
return $this;
}
public function isLive(): ?bool
{
return $this->live;
}
public function setLive(?bool $live): self
{
$this->live = $live;
return $this;
}
public function getUpdatedAt(): ?\DateTimeInterface
{
return $this->updated_at;
}
public function setUpdatedAt(?\DateTimeInterface $updated_at): self
{
$this->updated_at = $updated_at;
return $this;
}
#[ORM\PrePersist]
#[ORM\PreUpdate]
public function updatedTimestamps()
{
$this->setUpdatedAt(new \DateTime('now'));
}
public function getCustom3DAndroidModelUrl(): ?string
{
return $this->custom_3D_android_model_url;
}
public function setCustom3DAndroidModelUrl(?string $custom_3D_android_model_url): self
{
$this->custom_3D_android_model_url = $custom_3D_android_model_url;
return $this;
}
public function getCustom3DIosModelUrl(): ?string
{
return $this->custom_3D_ios_model_url;
}
public function setCustom3DIosModelUrl(?string $custom_3D_ios_model_url): self
{
$this->custom_3D_ios_model_url = $custom_3D_ios_model_url;
return $this;
}
public function getVideoUrl(): ?string
{
return $this->video_url;
}
public function setVideoUrl(?string $video_url): self
{
$this->video_url = $video_url;
return $this;
}
}