<?php 
 
namespace App\Entity; 
 
use ApiPlatform\Doctrine\Orm\Filter\SearchFilter; 
use ApiPlatform\Metadata\ApiFilter; 
use ApiPlatform\Metadata\ApiResource; 
use ApiPlatform\Metadata\GetCollection; 
use ApiPlatform\Metadata\Post; 
use ApiPlatform\Metadata\Put; 
use App\Controller\Action\DiscussionListController; 
use App\Controller\Action\DiscussionPostController; 
use App\Controller\Action\MessagePostController; 
use App\Repository\MessageRepository; 
use App\State\MessageGetColletionProcessor; 
use Doctrine\Common\Collections\ArrayCollection; 
use Doctrine\ORM\Mapping as ORM; 
use Doctrine\Common\Collections\Collection; 
use Symfony\Component\Serializer\Annotation\Groups; 
 
#[ORM\Entity(repositoryClass: MessageRepository::class)] 
#[ApiResource( 
 
    operations: [ 
        new Put(), 
        new Post( 
            uriTemplate: 'messages/new_message', 
            controller: MessagePostController::class, 
            read: false, 
            write: false, 
            name: '_api_/messages/new_message' 
        ), 
        new GetCollection(), 
    ], 
    normalizationContext: ['groups' => ['message.get','discussion.get']], 
    denormalizationContext: ['groups' => ['message.write']] 
)] 
#[ApiFilter( 
    SearchFilter::class, 
    properties: [ 
        'discussion' => 'exact', 
        'discussion.user' => 'exact', 
    ] 
)] 
class Message 
{ 
    #[ORM\Id] 
    #[ORM\GeneratedValue] 
    #[ORM\Column(type: "integer")] 
    #[Groups(['message.write','message.get'])] 
    private int $id; 
 
    #[ORM\ManyToOne(targetEntity: "Discussion")] 
    #[Groups(['message.write','message.get', 'discussion.get'])] 
    private Discussion $discussion; 
 
    #[ORM\ManyToOne(targetEntity: "User")] 
    #[Groups(['message.write','message.get'])] 
    private User $sender; 
 
    #[ORM\Column(type: "text")] 
    #[Groups(['message.write','message.get'])] 
    private string $messageText; 
 
    #[ORM\Column(type: "datetime")] 
    #[Groups(['message.write','message.get'])] 
    private \DateTimeInterface $createdAt; 
 
    #[ORM\OneToMany(mappedBy: 'message', targetEntity: MessageFile::class)] 
    #[Groups(['message.write','message.get'])] 
    private Collection $messageFiles; 
 
    #[ORM\Column] 
    #[Groups(['message.write','message.get'])] 
    private ?bool $isHotlineReaded = false; 
 
    public function __construct() 
    { 
        $this->createdAt = new \DateTimeImmutable(); 
        $this->messageFiles = new ArrayCollection(); 
    } 
 
    /** 
     * @return int 
     */ 
    public function getId(): int 
    { 
        return $this->id; 
    } 
 
    /** 
     * @return Discussion 
     */ 
    public function getDiscussion(): Discussion 
    { 
        return $this->discussion; 
    } 
 
    /** 
     * @param Discussion $discussion 
     */ 
    public function setDiscussion(Discussion $discussion): void 
    { 
        $this->discussion = $discussion; 
    } 
 
    /** 
     * @return User 
     */ 
    public function getSender(): User 
    { 
        return $this->sender; 
    } 
 
    /** 
     * @param User $sender 
     */ 
    public function setSender(User $sender): void 
    { 
        $this->sender = $sender; 
    } 
 
    /** 
     * @return string 
     */ 
    public function getMessageText(): string 
    { 
        return $this->messageText; 
    } 
 
    /** 
     * @param string $messageText 
     */ 
    public function setMessageText(string $messageText): void 
    { 
        $this->messageText = $messageText; 
    } 
 
    /** 
     * @return \DateTimeInterface 
     */ 
    public function getCreatedAt(): \DateTimeInterface 
    { 
        return $this->createdAt; 
    } 
 
    /** 
     * @param \DateTimeInterface $createdAt 
     */ 
    public function setCreatedAt(\DateTimeInterface $createdAt): void 
    { 
        $this->createdAt = $createdAt; 
    } 
 
    /** 
     * @return Collection<int, MessageFile> 
     */ 
    public function getMessageFiles(): Collection 
    { 
        return $this->messageFiles; 
    } 
 
    public function addMessageFile(MessageFile $messageFile): self 
    { 
        if (!$this->messageFiles->contains($messageFile)) { 
            $this->messageFiles->add($messageFile); 
            $messageFile->setMessage($this); 
        } 
 
        return $this; 
    } 
 
    public function removeMessageFile(MessageFile $messageFile): self 
    { 
        if ($this->messageFiles->removeElement($messageFile)) { 
            // set the owning side to null (unless already changed) 
            if ($messageFile->getMessage() === $this) { 
                $messageFile->setMessage(null); 
            } 
        } 
 
        return $this; 
    } 
 
    public function isHotlineReaded(): ?bool 
    { 
        return $this->isHotlineReaded; 
    } 
 
    public function setIsHotlineReaded(bool $isHotlineReaded): self 
    { 
        $this->isHotlineReaded = $isHotlineReaded; 
 
        return $this; 
    } 
 
}