<?php
namespace App\Entity\Account;
use App\Entity\User;
use App\Repository\SupportMessagesRepository;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping as ORM;
use Doctrine\ORM\PersistentCollection;
#[ORM\Table(name: 'support_messages')]
#[ORM\Entity(repositoryClass: SupportMessagesRepository::class)]
class SupportMessage
{
#[ORM\Id]
#[ORM\Column(name: 'id', type: 'integer')]
#[ORM\GeneratedValue(strategy: 'AUTO')]
protected int $id;
#[ORM\JoinColumn(name: 'parent_id', referencedColumnName: 'id', nullable: true)]
#[ORM\ManyToOne(targetEntity: SupportMessage::class, inversedBy: 'messages', cascade: ['all'])]
protected ?SupportMessage $parent;
#[ORM\OneToMany(targetEntity: SupportMessage::class, mappedBy: 'parent', cascade: ['all'], orphanRemoval: true)]
#[ORM\OrderBy(['createdAt' => 'ASC'])]
protected Collection $messages;
#[ORM\JoinColumn(name: 'user_id', referencedColumnName: 'id', nullable: true)]
#[ORM\ManyToOne(targetEntity: User::class)]
protected ?User $owner = null;
/**
* Defines whether a message is created by a user OR support manager.
*/
#[ORM\Column(type: 'boolean')]
protected bool $wroteByUser;
#[ORM\Column(type: 'string', nullable: true)]
protected ?string $email = null;
#[ORM\Column(type: 'string', nullable: true)]
protected ?string $topic = null;
#[ORM\Column(type: 'text')]
protected ?string $message = null;
#[ORM\Column(name: 'created_at', type: 'datetimetz_immutable', options: ['default' => 'CURRENT_TIMESTAMP'])]
protected \DateTimeImmutable $createdAt;
#[ORM\Column(name: 'last_message_at', type: 'datetimetz_immutable', options: ['default' => 'CURRENT_TIMESTAMP'])]
protected \DateTimeImmutable $lastMessageAt;
#[ORM\Column(type: 'boolean')]
protected bool $isRead = false;
function __construct()
{
$this->messages = new ArrayCollection();
$this->createdAt = new \DateTimeImmutable('now');
$this->lastMessageAt = $this->createdAt;
}
public function getLastMessageAt(): \DateTimeImmutable
{
return $this->lastMessageAt;
}
public function setLastMessageAt(\DateTimeImmutable $lastMessageAt): void
{
$this->lastMessageAt = $lastMessageAt;
}
public function isRead(): bool
{
return $this->isRead;
}
public function setIsRead(bool $isRead): void
{
$this->isRead = $isRead;
}
public function getOwner(): ?User
{
return $this->owner;
}
public function setOwner(?User $owner): void
{
$this->owner = $owner;
}
public function getCreatedAt(): \DateTimeImmutable
{
return $this->createdAt;
}
public function setCreatedAt(\DateTimeImmutable $createdAt): void
{
$this->createdAt = $createdAt;
}
public function getId(): int
{
return $this->id;
}
public function isOwnedBy(User $account): bool
{
return $account->getId() === $this->owner->getId();
}
public function getParent(): ?SupportMessage
{
return $this->parent;
}
public function setParent(?SupportMessage $parent): void
{
$this->parent = $parent;
}
public function getEmail(): ?string
{
return $this->email;
}
public function setEmail(?string $email): void
{
$this->email = $email;
}
public function getTopic(): ?string
{
return $this->topic;
}
public function setTopic(?string $topic): void
{
$this->topic = $topic;
}
public function getMessage(): ?string
{
return $this->message;
}
public function setMessage(string $message): void
{
$this->message = $message;
}
public function setTopicIsRead(bool $byUser): void
{
if(false == $byUser && true == $this->wroteByUser) {
$this->setIsRead(true);
} else if(true == $byUser && false == $this->wroteByUser) {
$this->setIsRead(true);
}
$this->getMessages()->map(function (SupportMessage $message) use ($byUser): SupportMessage {
if ($byUser != $message->isWroteByUser())
$message->setIsRead(true);
return $message;
});
}
/**
* @return SupportMessage[]
*/
public function getMessages(): Collection
{
return $this->messages;
}
public function setMessages(array $messages): void
{
$this->messages = new ArrayCollection($messages);
}
public function isWroteByUser(): bool
{
return $this->wroteByUser;
}
public function setWroteByUser(bool $wroteByUser): void
{
$this->wroteByUser = $wroteByUser;
}
}