<?php

namespace App\Entity;

use App\Repository\ProduitRepository;
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=ProduitRepository::class)
 * @ORM\Table(schema="sav")
 */
class Produit
{
    Const ID_PRODUIT_MO = 1;
    Const ID_PRODUIT_DEPL = 6;
    Const ID_PRODUIT_SUPP = 7;

    /**
     * @ORM\Id
     * @ORM\GeneratedValue
     * @ORM\Column(type="integer")
     * @Groups({"api"})
     */
    private $id;

    /**
     * @ORM\Column(type="string", length=15)
     * @Groups({"api"})
     */
    private $code;

    /**
     * @ORM\Column(type="string", length=200)
     * @Groups({"api"})
     */
    private $designation;

    /**
     * @ORM\Column(type="string", length=48, nullable=true)
     * @Groups({"api"})
     */
    private $gtin;

    /**
     * @ORM\Column(type="boolean", nullable=true)
     * @Groups({"api"})
     */
    private $gu_etendue;

    /**
     * @ORM\ManyToOne(targetEntity=FamilleAgi::class, inversedBy="produits")
     * @ORM\JoinColumn(name="idfamille_agi")
     * @Ignore()
     */
    private $famille_agi;

    /** @SerializedName("codeFamilleAgi")*/
    public function getCodeProduitAgi() {
        return $this->famille_agi->getLibelle();
    }

    /**
     * @ORM\ManyToOne(targetEntity=ProduitType::class, inversedBy="produits")
     * @ORM\JoinColumn(name="idproduit_type")
     * @Ignore()
     */
    private $produit_type;

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

    /** @SerializedName("siteName") */
    public function getSiteName() {
        return $this->site->getNom();
    }

    /**
     * @ORM\OneToMany(targetEntity=ProduitPrestationTarif::class, mappedBy="produit")
     */
    private $produitPrestationTarifs;

    /**
     * @ORM\Column(type="float", nullable=true)
     * @Groups({"api"})
     */
    private $prix_ht;

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

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

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

    /**
     * @ORM\OneToMany(targetEntity=ProduitStockSite::class, mappedBy="produit", orphanRemoval=true, cascade={"persist"})
     * @Ignore()
     */
    private $produitStockSites;

    /**
     * @ORM\OneToMany(targetEntity=SecteurTarif::class, mappedBy="produit")
     * @Ignore()
     */
    private $secteurTarifs;

    /**
     * @ORM\OneToMany(targetEntity=ProduitPhoto::class, mappedBy="produit", orphanRemoval=true, cascade={"persist"})
     * @Ignore()
     */
    private $produitPhotos;

    /**
     * @ORM\OneToMany(targetEntity=FactureLigne::class, mappedBy="produit")
     */
    private $factureLignes;

    /**
     * @ORM\OneToMany(targetEntity=DevisLigne::class, mappedBy="produit")
     */
    private $devisLignes;

    /** @SerializedName("visibleTablette") */
    public function getVisibleTablette() {
        foreach ($this->produitStockSites as $produitStockSite) {
            return $produitStockSite->getVisibleTablette();
        }
        return $this->site->getNom();
    }

    public function __construct()
    {
        $this->produitPrestationTarifs = new ArrayCollection();
        $this->produitStockSites = new ArrayCollection();
        $this->secteurTarifs = new ArrayCollection();
        $this->produitPhotos = new ArrayCollection();
        $this->factureLignes = new ArrayCollection();
        $this->devisLignes = new ArrayCollection();
    }

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

    public function setId(?int $id): self
    {
        $this->id = $id;

        return $this;
    }

    public function getCode(): ?string
    {
        return $this->code;
    }

    public function setCode(string $code): self
    {
        $this->code = $code;

        return $this;
    }

    public function getDesignation(): ?string
    {
        return $this->designation;
    }

    public function setDesignation(string $designation): self
    {
        $this->designation = $designation;

        return $this;
    }

    public function getGtin(): ?string
    {
        return $this->gtin;
    }

    public function setGtin(?string $gtin): self
    {
        $this->gtin = $gtin;

        return $this;
    }

    public function getGuEtendue(): ?bool
    {
        return $this->gu_etendue;
    }

    public function setGuEtendue(?bool $gu_etendue): self
    {
        $this->gu_etendue = $gu_etendue;

        return $this;
    }

    public function getFamilleAgi(): ?FamilleAgi
    {
        return $this->famille_agi;
    }

    public function setFamilleAgi(?FamilleAgi $famille_agi): self
    {
        $this->famille_agi = $famille_agi;

        return $this;
    }

    public function getProduitType(): ?ProduitType
    {
        return $this->produit_type;
    }

    public function setProduitType(?ProduitType $produit_type): self
    {
        $this->produit_type = $produit_type;

        return $this;
    }

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

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

        return $this;
    }

    /**
     * @return Collection|ProduitPrestationTarif[]
     */
    public function getProduitPrestationTarifs(): Collection
    {
        return $this->produitPrestationTarifs;
    }

    public function addProduitPrestationTarif(ProduitPrestationTarif $produitPrestationTarif): self
    {
        if (!$this->produitPrestationTarifs->contains($produitPrestationTarif)) {
            $this->produitPrestationTarifs[] = $produitPrestationTarif;
            $produitPrestationTarif->setProduit($this);
        }

        return $this;
    }

    public function removeProduitPrestationTarif(ProduitPrestationTarif $produitPrestationTarif): self
    {
        if ($this->produitPrestationTarifs->removeElement($produitPrestationTarif)) {
            // set the owning side to null (unless already changed)
            if ($produitPrestationTarif->getProduit() === $this) {
                $produitPrestationTarif->setProduit(null);
            }
        }

        return $this;
    }

    public function getPrixHt(): ?float
    {
        return $this->prix_ht;
    }

    public function setPrixHt(?float $prix_ht): self
    {
        $this->prix_ht = $prix_ht;

        return $this;
    }

    public function getDateCreation(): ?\DateTimeInterface
    {
        return $this->date_creation;
    }

    public function setDateCreation(?\DateTimeInterface $date_creation): self
    {
        $this->date_creation = $date_creation;

        return $this;
    }

    public function getDateModification(): ?\DateTimeInterface
    {
        return $this->date_modification;
    }

    public function setDateModification(?\DateTimeInterface $date_modification): self
    {
        $this->date_modification = $date_modification;

        return $this;
    }

    public function getDateSuppression(): ?\DateTimeInterface
    {
        return $this->date_suppression;
    }

    public function setDateSuppression(?\DateTimeInterface $date_suppression): self
    {
        $this->date_suppression = $date_suppression;

        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->setProduit($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->getProduit() === $this) {
                $produitStockSite->setProduit(null);
            }
        }

        return $this;
    }

    /**
     * @return Collection|SecteurTarif[]
     */
    public function getSecteurTarifs(): Collection
    {
        return $this->secteurTarifs;
    }

    public function addSecteurTarif(SecteurTarif $secteurTarif): self
    {
        if (!$this->secteurTarifs->contains($secteurTarif)) {
            $this->secteurTarifs[] = $secteurTarif;
            $secteurTarif->setProduit($this);
        }

        return $this;
    }

    public function removeSecteurTarif(SecteurTarif $secteurTarif): self
    {
        if ($this->secteurTarifs->removeElement($secteurTarif)) {
            // set the owning side to null (unless already changed)
            if ($secteurTarif->getProduit() === $this) {
                $secteurTarif->setProduit(null);
            }
        }

        return $this;
    }

    /**
     * @return Collection|ProduitPhoto[]
     */
    public function getProduitPhotos(): Collection
    {
        return $this->produitPhotos;
    }

    public function addProduitPhoto(ProduitPhoto $produitPhoto): self
    {
        if (!$this->produitPhotos->contains($produitPhoto)) {
            $this->produitPhotos[] = $produitPhoto;
            $produitPhoto->setProduit($this);
        }

        return $this;
    }

    public function removeProduitPhoto(ProduitPhoto $produitPhoto): self
    {
        if ($this->produitPhotos->removeElement($produitPhoto)) {
            // set the owning side to null (unless already changed)
            if ($produitPhoto->getProduit() === $this) {
                $produitPhoto->setProduit(null);
            }
        }

        return $this;
    }

    /**
     * @return Collection<int, FactureLigne>
     */
    public function getFactureLignes(): Collection
    {
        return $this->factureLignes;
    }

    public function addFactureLigne(FactureLigne $factureLigne): self
    {
        if (!$this->factureLignes->contains($factureLigne)) {
            $this->factureLignes[] = $factureLigne;
            $factureLigne->setProduit($this);
        }

        return $this;
    }

    public function removeFactureLigne(FactureLigne $factureLigne): self
    {
        if ($this->factureLignes->removeElement($factureLigne)) {
            // set the owning side to null (unless already changed)
            if ($factureLigne->getProduit() === $this) {
                $factureLigne->setProduit(null);
            }
        }

        return $this;
    }

    /**
     * @return Collection<int, DevisLigne>
     */
    public function getDevisLignes(): Collection
    {
        return $this->devisLignes;
    }

    public function addDevisLigne(DevisLigne $devisLigne): self
    {
        if (!$this->devisLignes->contains($devisLigne)) {
            $this->devisLignes[] = $devisLigne;
            $devisLigne->setProduit($this);
        }

        return $this;
    }

    public function removeDevisLigne(DevisLigne $devisLigne): self
    {
        if ($this->devisLignes->removeElement($devisLigne)) {
            // set the owning side to null (unless already changed)
            if ($devisLigne->getProduit() === $this) {
                $devisLigne->setProduit(null);
            }
        }

        return $this;
    }
}
