<?php

namespace App\Entity;

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

/**
 * @ORM\Entity(repositoryClass=SiteRepository::class)
 * @ORM\Table(schema="sav")
 */
class Site
{
    /**
     * @ORM\Id
     * @ORM\GeneratedValue
     * @Groups({"site_list"})
     * @ORM\Column(type="integer")
     */
    private $id;

    /**
     * @ORM\Column(type="smallint", nullable=true)
     */
    private $num;

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

    /**
     * @ORM\Column(type="boolean", nullable=true)
     */
    private $antenne;

    /**
     * @ORM\OneToMany(targetEntity=Agence::class, mappedBy="site")
     * @Ignore()
     */
    private $agences;

    /**
     * @ORM\OneToMany(targetEntity=Groupe::class, mappedBy="site")
     * @Ignore()
     */
    private $groupes;

    /**
     * @ORM\OneToMany(targetEntity=UtilisateurSite::class, mappedBy="site")
     * @Ignore()
     */
    private $utilisateurSites;

    /**
     * @ORM\OneToMany(targetEntity=Appareil::class, mappedBy="site")
     * @Ignore()
     */
    private $appareils;

    /**
     * @ORM\OneToMany(targetEntity=Produit::class, mappedBy="site")
     * @Ignore()
     */
    private $produits;

    /**
     * @ORM\OneToMany(targetEntity=ProduitStockSite::class, mappedBy="site", orphanRemoval=true)
     * @Ignore()
     */
    private $produitStockSites;

    /**
     * @ORM\OneToMany(targetEntity=SectorisationVersion::class, mappedBy="site")
     * @Ignore()
     */
    private $sectorisationVersions;

    /**
     * @ORM\OneToMany(targetEntity=Equipement::class, mappedBy="site")
     * @Ignore()
     */
    private $equipements;

    /**
     * @ORM\OneToMany(targetEntity=Facture::class, mappedBy="site")
     * @Ignore()
     */
    private $factures;

    /**
     * @ORM\OneToMany(targetEntity=ClientSite::class, mappedBy="site", orphanRemoval=true)
     * @Ignore()
     */
    private $clientSites;

    /**
     * @ORM\OneToMany(targetEntity=Intervention::class, mappedBy="site")
     * @Ignore()
     */
    private $interventions;

    /**
     * @ORM\OneToMany(targetEntity=Planning::class, mappedBy="site")
     */
    private $plannings;

    /**
     * @ORM\OneToMany(targetEntity=EvenementLieu::class, mappedBy="site")
     */
    private $evenementLieus;

    /**
     * @ORM\OneToMany(targetEntity=UtilisateurFiltre::class, mappedBy="site")
     * @Ignore()
     */
    private $utilisateurFiltres;

    /**
     * @ORM\OneToMany(targetEntity=PlnParametres::class, mappedBy="site")
     * @Ignore()
     */
    private $plnParametres;

    /**
     * @ORM\OneToMany(targetEntity=HorairePassage::class, mappedBy="site")
     * @Ignore()
     */
    private $horairePassage;


    public function __construct()
    {
        $this->agences = new ArrayCollection();
        $this->groupes = new ArrayCollection();
        $this->utilisateurSites = new ArrayCollection();
        $this->appareils = new ArrayCollection();
        $this->produits = new ArrayCollection();
        $this->produitStockSites = new ArrayCollection();
        $this->sectorisationVersions = new ArrayCollection();
        $this->equipements = new ArrayCollection();
        $this->factures = new ArrayCollection();
        $this->clientSites = new ArrayCollection();
        $this->interventions = new ArrayCollection();
        $this->plannings = new ArrayCollection();
        $this->evenementLieus = new ArrayCollection();
        $this->utilisateurFiltres = new ArrayCollection();
        $this->plnParametres = new ArrayCollection();
    }

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

    public function getNum(): ?int
    {
        return $this->num;
    }

    public function setNum(?int $num): self
    {
        $this->num = $num;

        return $this;
    }

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

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

        return $this;
    }

    public function getAntenne(): ?bool
    {
        return $this->antenne;
    }

    public function setAntenne(?bool $antenne): self
    {
        $this->antenne = $antenne;

        return $this;
    }

    public function __toString()
    {
        return $this->getNom();
    }

    /**
     * @return Collection|Agence[]
     */
    public function getAgences(): Collection
    {
        return $this->agences;
    }

    public function addAgence(Agence $agence): self
    {
        if (!$this->agences->contains($agence)) {
            $this->agences[] = $agence;
            $agence->setSite($this);
        }

        return $this;
    }

    public function removeAgence(Agence $agence): self
    {
        if ($this->agences->removeElement($agence)) {
            // set the owning side to null (unless already changed)
            if ($agence->getSite() === $this) {
                $agence->setSite(null);
            }
        }

        return $this;
    }

    /**
     * @return Collection|Groupe[]
     */
    public function getGroupes(): Collection
    {
        return $this->groupes;
    }

    public function addGroupe(Groupe $groupe): self
    {
        if (!$this->groupes->contains($groupe)) {
            $this->groupes[] = $groupe;
            $groupe->setSite($this);
        }

        return $this;
    }

    public function removeGroupe(Groupe $groupe): self
    {
        if ($this->groupes->removeElement($groupe)) {
            // set the owning side to null (unless already changed)
            if ($groupe->getSite() === $this) {
                $groupe->setSite(null);
            }
        }

        return $this;
    }

    /**
     * @return Collection|UtilisateurSite[]
     */
    public function getUtilisateurSites(): Collection
    {
        return $this->utilisateurSites;
    }

    public function addUtilisateurSite(UtilisateurSite $utilisateurSite): self
    {
        if (!$this->utilisateurSites->contains($utilisateurSite)) {
            $this->utilisateurSites[] = $utilisateurSite;
            $utilisateurSite->setSite($this);
        }

        return $this;
    }

    public function removeUtilisateurSite(UtilisateurSite $utilisateurSite): self
    {
        if ($this->utilisateurSites->removeElement($utilisateurSite)) {
            // set the owning side to null (unless already changed)
            if ($utilisateurSite->getSite() === $this) {
                $utilisateurSite->setSite(null);
            }
        }

        return $this;
    }

    /**
     * @return Collection|Appareil[]
     */
    public function getAppareils(): Collection
    {
        return $this->appareils;
    }

    public function addAppareil(Appareil $appareil): self
    {
        if (!$this->appareils->contains($appareil)) {
            $this->appareils[] = $appareil;
            $appareil->setSite($this);
        }

        return $this;
    }

    public function removeAppareil(Appareil $appareil): self
    {
        if ($this->appareils->removeElement($appareil)) {
            // set the owning side to null (unless already changed)
            if ($appareil->getSite() === $this) {
                $appareil->setSite(null);
            }
        }

        return $this;
    }

    /**
     * @return Collection|Produit[]
     */
    public function getProduits(): Collection
    {
        return $this->produits;
    }

    public function addProduit(Produit $produit): self
    {
        if (!$this->produits->contains($produit)) {
            $this->produits[] = $produit;
            $produit->setSite($this);
        }

        return $this;
    }

    public function removeProduit(Produit $produit): self
    {
        if ($this->produits->removeElement($produit)) {
            // set the owning side to null (unless already changed)
            if ($produit->getSite() === $this) {
                $produit->setSite(null);
            }
        }

        return $this;
    }

    /**
     * @return Collection|ProduitStockSite[]
     */
    public function getProduitStockSites(): Collection
    {
        return $this->produitStockSites;
    }

    public function addProduitStockSite(ProduitStockSite $produitStockSite): self
    {
        if (!$this->produitStockSites->contains($produitStockSite)) {
            $this->produitStockSites[] = $produitStockSite;
            $produitStockSite->setSite($this);
        }

        return $this;
    }

    public function removeProduitStockSite(ProduitStockSite $produitStockSite): self
    {
        if ($this->produitStockSites->removeElement($produitStockSite)) {
            // set the owning side to null (unless already changed)
            if ($produitStockSite->getSite() === $this) {
                $produitStockSite->setSite(null);
            }
        }

        return $this;
    }

    /**
     * @return Collection<int, SectorisationVersion>
     */
    public function getSectorisationVersions(): Collection
    {
        return $this->sectorisationVersions;
    }

    public function addSectorisationVersion(SectorisationVersion $sectorisationVersion): self
    {
        if (!$this->sectorisationVersions->contains($sectorisationVersion)) {
            $this->sectorisationVersions[] = $sectorisationVersion;
            $sectorisationVersion->setSite($this);
        }

        return $this;
    }

    public function removeSectorisationVersion(SectorisationVersion $sectorisationVersion): self
    {
        if ($this->sectorisationVersions->removeElement($sectorisationVersion)) {
            // set the owning side to null (unless already changed)
            if ($sectorisationVersion->getSite() === $this) {
                $sectorisationVersion->setSite(null);
            }
        }

        return $this;
    }

    /**
     * @return Collection<int, Equipement>
     */
    public function getEquipements(): Collection
    {
        return $this->equipements;
    }

    public function addEquipement(Equipement $equipement): self
    {
        if (!$this->equipements->contains($equipement)) {
            $this->equipements[] = $equipement;
            $equipement->setSite($this);
        }

        return $this;
    }

    public function removeEquipement(Equipement $equipement): self
    {
        if ($this->equipements->removeElement($equipement)) {
            // set the owning side to null (unless already changed)
            if ($equipement->getSite() === $this) {
                $equipement->setSite(null);
            }
        }

        return $this;
    }

    /**
     * @return Collection<int, Facture>
     */
    public function getFactures(): Collection
    {
        return $this->factures;
    }

    public function addFacture(Facture $facture): self
    {
        if (!$this->factures->contains($facture)) {
            $this->factures[] = $facture;
            $facture->setSite($this);
        }

        return $this;
    }

    public function removeFacture(Facture $facture): self
    {
        if ($this->factures->removeElement($facture)) {
            // set the owning side to null (unless already changed)
            if ($facture->getSite() === $this) {
                $facture->setSite(null);
            }
        }

        return $this;
    }

    /**
     * @return Collection<int, ClientSite>
     */
    public function getClientSites(): Collection
    {
        return $this->clientSites;
    }

    public function addClientSite(ClientSite $clientSite): self
    {
        if (!$this->clientSites->contains($clientSite)) {
            $this->clientSites[] = $clientSite;
            $clientSite->setSite($this);
        }

        return $this;
    }

    public function removeClientSite(ClientSite $clientSite): self
    {
        if ($this->clientSites->removeElement($clientSite)) {
            // set the owning side to null (unless already changed)
            if ($clientSite->getSite() === $this) {
                $clientSite->setSite(null);
            }
        }

        return $this;
    }

    /**
     * @return Collection<int, Intervention>
     */
    public function getInterventions(): Collection
    {
        return $this->interventions;
    }

    public function addIntervention(Intervention $intervention): self
    {
        if (!$this->interventions->contains($intervention)) {
            $this->interventions[] = $intervention;
            $intervention->setSite($this);
        }

        return $this;
    }

    public function removeIntervention(Intervention $intervention): self
    {
        if ($this->interventions->removeElement($intervention)) {
            // set the owning side to null (unless already changed)
            if ($intervention->getSite() === $this) {
                $intervention->setSite(null);
            }
        }

        return $this;
    }

    /**
     * @return Collection<int, Planning>
     */
    public function getPlannings(): Collection
    {
        return $this->plannings;
    }

    public function addPlanning(Planning $planning): self
    {
        if (!$this->plannings->contains($planning)) {
            $this->plannings[] = $planning;
            $planning->setSite($this);
        }

        return $this;
    }

    public function removePlanning(Planning $planning): self
    {
        if ($this->plannings->removeElement($planning)) {
            // set the owning side to null (unless already changed)
            if ($planning->getSite() === $this) {
                $planning->setSite(null);
            }
        }

        return $this;
    }

    /**
     * @return Collection<int, EvenementLieu>
     */
    public function getEvenementLieus(): Collection
    {
        return $this->evenementLieus;
    }

    public function addEvenementLieu(EvenementLieu $evenementLieu): self
    {
        if (!$this->evenementLieus->contains($evenementLieu)) {
            $this->evenementLieus[] = $evenementLieu;
            $evenementLieu->setSite($this);
        }

        return $this;
    }

    public function removeEvenementLieu(EvenementLieu $evenementLieu): self
    {
        if ($this->evenementLieus->removeElement($evenementLieu)) {
            // set the owning side to null (unless already changed)
            if ($evenementLieu->getSite() === $this) {
                $evenementLieu->setSite(null);
            }
        }

        return $this;
    }

    /**
     * @return Collection<int, UtilisateurFiltre>
     */
    public function getUtilisateurFiltres(): Collection
    {
        return $this->utilisateurFiltres;
    }

    public function addUtilisateurFiltre(UtilisateurFiltre $utilisateurFiltre): self
    {
        if (!$this->utilisateurFiltres->contains($utilisateurFiltre)) {
            $this->utilisateurFiltres[] = $utilisateurFiltre;
            $utilisateurFiltre->setSite($this);
        }

        return $this;
    }

    public function removeUtilisateurFiltre(UtilisateurFiltre $utilisateurFiltre): self
    {
        if ($this->utilisateurFiltres->removeElement($utilisateurFiltre)) {
            // set the owning side to null (unless already changed)
            if ($utilisateurFiltre->getSite() === $this) {
                $utilisateurFiltre->setSite(null);
            }
        }

        return $this;
    }

    /**
     * @return Collection<int, PlnParametres>
     */
    public function getPlnParametres(): Collection
    {
        return $this->plnParametres;
    }

    public function addPlnParametre(PlnParametres $plnParametre): self
    {
        if (!$this->plnParametres->contains($plnParametre)) {
            $this->plnParametres[] = $plnParametre;
            $plnParametre->setSite($this);
        }

        return $this;
    }

    public function removePlnParametre(PlnParametres $plnParametre): self
    {
        if ($this->plnParametres->removeElement($plnParametre)) {
            // set the owning side to null (unless already changed)
            if ($plnParametre->getSite() === $this) {
                $plnParametre->setSite(null);
            }
        }

        return $this;
    }

    public function UsePlageHoraire() {
        return true;
        if ($this->plnParametres) {
            foreach ($this->plnParametres as $plnParametre) {
                if ($plnParametre->getNomParam() == 'UsePlagesHoraires') return $plnParametre->getValeurAlphanum();
            }
        }
        return null;
    }

    /**
     * @return mixed
     */
    public function getHorairePassage()
    {
        return $this->horairePassage;
    }

    /**
     * @param mixed $horairePassage
     */
    public function setHorairePassage($horairePassage): void
    {
        $this->horairePassage = $horairePassage;
    }
}
