<?php

namespace App\Entity;

use App\Repository\SecteurRepository;
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;
use Symfony\Component\Serializer\Annotation\SerializedName;

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

    /**
     * @ORM\Column(type="integer", nullable=true)
     * @Groups({"map"})
     */
    private $numero;

    /**
     * @ORM\ManyToOne(targetEntity=SectorisationVersion::class, inversedBy="secteurs")
     * @ORM\JoinColumn(name="idsectorisation_version")
     * @Groups({"map"})
     */
    private $sectorisation_version;

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

    /**
     * @ORM\ManyToOne(targetEntity=SecteurTauxRetour::class, inversedBy="secteurs")
     * @ORM\JoinColumn(name="idsecteur_taux_retour")
     */
    private $secteur_taux_retour;

    /**
     * @ORM\ManyToOne(targetEntity=SecteurActivite::class, inversedBy="secteurs")
     * @ORM\JoinColumn(name="idsecteur_activite")
     * @Groups({"map"})
     */
    private $secteur_activite;

    /**
     * @ORM\Column(type="json", nullable=true)
     * @Groups({"map", "cas"})
     */
    private $coordonnees = [];

    /**
     * @ORM\OneToMany(targetEntity=AgentSecteur::class, mappedBy="secteurVersion", orphanRemoval=true)
     * @Groups({"map"})
     */
    private $agentSecteurs;

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

    /**
     * @ORM\ManyToOne(targetEntity=SecteurZone::class, inversedBy="secteurs")
     * @ORM\JoinColumn(name="idsecteur_zone")
     * @Groups({"map"})
     */
    private $secteur_zone;

    /**
     * @ORM\OneToMany(targetEntity=SecteurEquipement::class, mappedBy="secteur", orphanRemoval=true)
     * @Ignore()
     */
    private $secteurEquipements;

    /**
     * @Groups({"map"})
     */
    private $nbEquipement;

    /**
     * @ORM\ManyToOne(targetEntity=Utilisateur::class, inversedBy="secteurs")
     * @ORM\JoinColumn(name="idutilisateur_planning")
     */
    private $utilisateur_planning;


    public function __construct()
    {
        $this->agentSecteurs = new ArrayCollection();
        $this->equipements = new ArrayCollection();
        $this->secteurEquipements = new ArrayCollection();
    }

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

    public function getNumero(): ?int
    {
        return $this->numero;
    }

    public function setNumero(?int $numero): self
    {
        $this->numero = $numero;

        return $this;
    }

    public function getSectorisationVersion(): ?SectorisationVersion
    {
        return $this->sectorisation_version;
    }

    public function setSectorisationVersion(?SectorisationVersion $sectorisation_version): self
    {
        $this->sectorisation_version = $sectorisation_version;

        return $this;
    }

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

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

        return $this;
    }

    public function getSecteurTauxRetour(): ?SecteurTauxRetour
    {
        return $this->secteur_taux_retour;
    }

    public function setSecteurTauxRetour(?SecteurTauxRetour $secteur_taux_retour): self
    {
        $this->secteur_taux_retour = $secteur_taux_retour;

        return $this;
    }

    public function getSecteurActivite(): ?SecteurActivite
    {
        return $this->secteur_activite;
    }

    public function setSecteurActivite(?SecteurActivite $secteur_activite): self
    {
        $this->secteur_activite = $secteur_activite;

        return $this;
    }

    public function getCoordonnees(): ?array
    {
        return $this->coordonnees;
    }

    public function setCoordonnees(?array $coordonnees): self
    {
        $this->coordonnees = $coordonnees;

        return $this;
    }

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

    /**
     * @return Collection<int, AgentSecteur>
     */
    public function getAgentSecteurs(): Collection
    {
        return $this->agentSecteurs;
    }

    public function addAgentSecteur(AgentSecteur $agentSecteur): self
    {
        if (!$this->agentSecteurs->contains($agentSecteur)) {
            $this->agentSecteurs[] = $agentSecteur;
            $agentSecteur->setSecteurVersion($this);
        }

        return $this;
    }

    public function removeAgentSecteur(AgentSecteur $agentSecteur): self
    {
        if ($this->agentSecteurs->removeElement($agentSecteur)) {
            // set the owning side to null (unless already changed)
            if ($agentSecteur->getSecteurVersion() === $this) {
                $agentSecteur->setSecteurVersion(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->setSecteur($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->getSecteur() === $this) {
                $equipement->setSecteur(null);
            }
        }

        return $this;
    }

    public function getSecteurZone(): ?SecteurZone
    {
        return $this->secteur_zone;
    }

    public function setSecteurZone(?SecteurZone $secteur_zone): self
    {
        $this->secteur_zone = $secteur_zone;

        return $this;
    }

    public function isZUD() {
        return ($this->getSecteurZone()->getLibelle() == 'ZUD');
    }

    public function getIdNom()
    {
        return $this->getNumero() . ' : ' . $this->getNom();
    }

    /** @SerializedName("agentPrincipal")
     * @Groups({"map","cas"})
     */
    public function getAgentPrincipal() {
        foreach ($this->agentSecteurs as $agentSecteur) {
            if ($agentSecteur->getRangTri() == 1) return $agentSecteur->getUtilisateurAgent();
        }
        return null;
    }

    /**
     * @return Collection<int, SecteurEquipement>
     */
    public function getSecteurEquipements(): Collection
    {
        return $this->secteurEquipements;
    }

    public function addSecteurEquipement(SecteurEquipement $secteurEquipement): self
    {
        if (!$this->secteurEquipements->contains($secteurEquipement)) {
            $this->secteurEquipements[] = $secteurEquipement;
            $secteurEquipement->setSecteur($this);
        }

        return $this;
    }

    public function removeSecteurEquipement(SecteurEquipement $secteurEquipement): self
    {
        if ($this->secteurEquipements->removeElement($secteurEquipement)) {
            // set the owning side to null (unless already changed)
            if ($secteurEquipement->getSecteur() === $this) {
                $secteurEquipement->setSecteur(null);
            }
        }

        return $this;
    }

    public function getNbEquipement()
    {
        return $this->nbEquipement;
    }

    public function setNbEquipement($nbEquipement): self
    {
        $this->nbEquipement = $nbEquipement;

        return $this;
    }

    public function getUtilisateurPlanning(): ?Utilisateur
    {
        return $this->utilisateur_planning;
    }

    public function setUtilisateurPlanning(?Utilisateur $utilisateur_planning): self
    {
        $this->utilisateur_planning = $utilisateur_planning;

        return $this;
    }
}
