<?php

namespace App\Entity;

use App\Repository\GroupeRepository;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping as ORM;
use Doctrine\ORM\Mapping\Index;
use Symfony\Component\Serializer\Annotation\Groups;
use Symfony\Component\Serializer\Annotation\Ignore;
use Symfony\Component\Serializer\Annotation\SerializedName;

/**
 * @ORM\Entity(repositoryClass=GroupeRepository::class)
 * @ORM\Table(schema="sav")
 */
class Groupe
{
    /**
     * @ORM\Id
     * @ORM\GeneratedValue
     * @ORM\Column(type="integer")
     * @Groups({"site", "map", "planning"})
     */
    private $id;

    /**
     * @ORM\OneToMany(targetEntity=GroupeUtilisateur::class, mappedBy="groupe", cascade={"remove"})
     */
    private $groupesUtilisateur;

    /**
     * @SerializedName("utilisateurs")
     * @Groups({"site"})
     */
    public function getUtilisateurs() {
        $utilisateurs = [];
        foreach ($this->getGroupesUtilisateur() as $groupeUtilisateur) {
            $utilisateurs[] = $groupeUtilisateur->getUtilisateur();
        }
        return $utilisateurs;

    }

    /**
     * @ORM\OneToMany(targetEntity=TchatMessage::class, mappedBy="groupe", cascade={"remove"})
     * @Ignore()
     */
    private $messages;

    /**
     * @ORM\ManyToOne(targetEntity=GroupeType::class, inversedBy="Groupes")
     * @ORM\JoinColumn(nullable=false, name="idgroupe_type"))
     * @Ignore()
     */
    private $groupe_type;

    /**
     * @ORM\Column(type="string", length=255, nullable=true)
     * @Groups({"site", "planning"})
     */
    private $nom;

    /**
     * @ORM\ManyToOne(targetEntity=Utilisateur::class, inversedBy="Groupes")
     * @ORM\JoinColumn(name="idutilisateur_admin_groupe"))
     * @Groups({"site", "planning"})
     */
    private $admin;

    /**
     * @ORM\ManyToOne(targetEntity=Site::class, inversedBy="Groupes")
     * @ORM\JoinColumn(name="idsite"))
     */
    private $site;

    /**
     * @ORM\Column(type="boolean", nullable=true,  options={"default" = 1})
     * @Groups({"site_list", "planning"})
     */
    private $actif;


    /** @SerializedName("typeNom")
     * @Groups({"site_list", "site", "map", "planning"})
     */
    public function getTypeNom() {
        return $this->getGroupeType()->getLibelle() . ' - ' . $this->getNom();
    }

    public function __construct()
    {
        $this->groupesUtilisateur = new ArrayCollection();
        $this->messages = new ArrayCollection();
    }

    public function getId(): ?int
    {
        return $this->id;
    }

    /**
     * @return Collection|GroupeUtilisateur[]
     */
    public function getGroupesUtilisateur(): Collection
    {
        return $this->groupesUtilisateur;
    }

    public function addGroupeUtilisateur(GroupeUtilisateur $groupeUtilisateur): self
    {
        if (!$this->groupesUtilisateur->contains($groupeUtilisateur)) {
            $this->groupesUtilisateur[] = $groupeUtilisateur;
            $groupeUtilisateur->setGroupe($this);
        }

        return $this;
    }

    public function removeGoupeUtilisateur(GroupeUtilisateur $groupeUtilisateur): self
    {
        if ($this->groupesUtilisateur->removeElement($groupeUtilisateur)) {
            // set the owning side to null (unless already changed)
            if ($groupeUtilisateur->getGroupe() === $this) {
                $groupeUtilisateur->setConversation(null);
            }
        }

        return $this;
    }

    public function getMembers() {
        $members = [];
        foreach ($this->getGroupesUtilisateur() as $groupeUtilisateur) {
            $members[] = [
                'nom' => (string)$groupeUtilisateur->getUtilisateur(),
                'notification' => $groupeUtilisateur->getNotification()
            ];
        }
        return $members;
    }

    public function getUtilisateursDernierMessageLu() {
        $result = [];
        foreach ($this->getGroupesUtilisateur() as $groupeUtilisateur) {
            $idDernierMessage = ($groupeUtilisateur->getDernierMessageLu()) ? $groupeUtilisateur->getDernierMessageLu()->getId() : null;
            $result[] = ['utilisateur' => $groupeUtilisateur->getUtilisateur(), 'idMessage' =>$idDernierMessage];
        }
        return $result;
    }

    /**
     * @return Collection|TchatMessage[]
     * @Ignore()
     */
    public function getMessages(): Collection
    {
        return $this->messages;
    }

    public function addMessage(TchatMessage $message): self
    {
        if (!$this->messages->contains($message)) {
            $this->messages[] = $message;
            $message->setConversation($this);
        }

        return $this;
    }

    public function removeMessage(TchatMessage $message): self
    {
        if ($this->messages->removeElement($message)) {
            // set the owning side to null (unless already changed)
            if ($message->getConversation() === $this) {
                $message->setConversation(null);
            }
        }

        return $this;
    }

    public function getGroupeType(): ?GroupeType
    {
        return $this->groupe_type;
    }

    public function setGroupeType(?GroupeType $type): self
    {
        $this->groupe_type = $type;

        return $this;
    }

    public function getNom(): ?string
    {
        return $this->nom;
    }

    public function setNom(?string $nom): self
    {
        $this->nom = $nom;

        return $this;
    }

    public function getAdmin(): ?Utilisateur
    {
        return $this->admin;
    }

    public function setAdmin(?Utilisateur $admin): self
    {
        $this->admin = $admin;

        return $this;
    }

    public function getSite(): ?Site
    {
        return $this->site;
    }

    public function setSite(?Site $site): self
    {
        $this->site = $site;

        return $this;
    }

    public function getActif(): ?bool
    {
        return $this->actif;
    }

    public function setActif(?bool $actif): self
    {
        $this->actif = $actif;

        return $this;
    }
}
