<?php

namespace App\Entity;

use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping as ORM;

/**
 * Oeuvre.
 *
 * @ORM\Table(name="oeuvre")
 * @ORM\Entity(repositoryClass="App\Repository\OeuvreRepository")
 */
class Oeuvre
{
    /**
     * @var int
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @var string
     *
     * @ORM\Column(name="titre", type="string", length=100)
     */
    private $titre;

    /**
     * @var string
     *
     * @ORM\Column(name="soustitre", type="string", length=100, nullable=true)
     */
    private $sousTitre;

    /**
     * @var int
     *
     * @ORM\Column(name="annee", type="integer", nullable=true)
     */
    private $annee;

    /**
     * @var int
     *
     * @ORM\Column(name="ageminimum", type="integer", nullable=true)
     */
    private $ageMinimum;

    /**
     * @var Audience
     *
     * @ORM\ManyToOne(
     *     targetEntity="App\Entity\Audience",
     *     inversedBy="oeuvres"
     * )
     */
    private $audience;

    /**
     * @var Collection
     *
     * @ORM\ManyToMany(
     *     targetEntity="App\Entity\Nationalite",
     *     inversedBy="oeuvres"
     * )
     */
    private $nationalites;

    /**
     * @var Collection
     *
     * @ORM\ManyToMany(
     *     targetEntity="App\Entity\Langue",
     *     inversedBy="oeuvres"
     * )
     */
    private $langues;

    /**
     * @var CategorieOeuvre
     *
     * @ORM\ManyToOne(
     *     targetEntity="App\Entity\CategorieOeuvre",
     *     inversedBy="oeuvres"
     * )
     * @ORM\JoinColumn(name="categorieoeuvre_id", referencedColumnName="id")
     */
    private $categorieOeuvre;

    /**
     * @var Collection
     *
     * @ORM\OneToMany(
     *     targetEntity="App\Entity\OeuvreCategorieArtiste",
     *     mappedBy="oeuvre"
     * )
     */
    private $oeuvreCategorieArtistes;

    /**
     * @var Partie
     *
     * @ORM\OneToOne(
     *     targetEntity="App\Entity\Partie",
     *     mappedBy="oeuvre"
     * )
     */
    private $partie;

    /**
     * @var Collection
     *
     * @ORM\ManyToMany(
     *     targetEntity="App\Entity\Support",
     *     inversedBy="oeuvres"
     * )
     */
    private $supports;

    /**
     * @var Collection
     *
     * @ORM\ManyToMany(
     *     targetEntity="App\Entity\GroupePrincipal",
     *     inversedBy="oeuvres"
     * )
     * @ORM\JoinTable(
     *     name="oeuvre_groupeprincipal",
     *     joinColumns={
     *         @ORM\JoinColumn(
     *             name="oeuvre_id",
     *             referencedColumnName="id"
     *         )
     *     },
     *     inverseJoinColumns={
     *         @ORM\JoinColumn(
     *             name="groupeprincipal_id",
     *             referencedColumnName="id"
     *         )
     *     }
     * )
     */
    private $groupesPrincipaux;

    /**
     * Constructeur.
     *
     * @param string|null $titre
     * @param string|null $sousTitre
     * @param int|null    $annee
     * @param int|null    $ageMinimum
     */
    public function __construct(
        string $titre = null,
        string $sousTitre = null,
        int $annee = null,
        int $ageMinimum = null
    ) {
        $this->titre = $this->checkTitre($titre);
        $this->sousTitre = $this->checkTitre($sousTitre);
        $this->annee = $annee;
        $this->ageMinimum = $ageMinimum;
        $this->nationalites = new ArrayCollection();
        $this->langues = new ArrayCollection();
        $this->oeuvreCategorieArtistes = new ArrayCollection();
        $this->supports = new ArrayCollection();
        $this->groupesPrincipaux = new ArrayCollection();
    }

    /**
     * Get id.
     *
     * @return int
     */
    public function getId(): int
    {
        return $this->id;
    }

    /**
     * Set titre.
     *
     * @param string $titre
     */
    public function setTitre(?string $titre): void
    {
        $this->titre = $titre;
    }

    /**
     * Get titre.
     *
     * @return string|null
     */
    public function getTitre(): ?string
    {
        return $this->titre;
    }

    /**
     * Set sousTitre.
     *
     * @param string|null $sousTitre
     */
    public function setSousTitre(?string $sousTitre): void
    {
        $this->sousTitre = $sousTitre;
    }

    /**
     * Get sousTitre.
     *
     * @return string
     */
    public function getSousTitre(): ?string
    {
        return $this->sousTitre;
    }

    /**
     * Set annee.
     *
     * @param int|null $annee
     */
    public function setAnnee(?int $annee): void
    {
        $this->annee = $annee;
    }

    /**
     * Get annee.
     *
     * @return int|null
     */
    public function getAnnee(): ?int
    {
        return $this->annee;
    }

    /**
     * Set ageMinimum.
     *
     * @param int|null $ageMinimum
     */
    public function setAgeMinimum(?int $ageMinimum): void
    {
        $this->ageMinimum = $ageMinimum;
    }

    /**
     * Get ageMinimum.
     *
     * @return int
     */
    public function getAgeMinimum(): ?int
    {
        return $this->ageMinimum;
    }

    /**
     * @param mixed $titre
     * @param int   $maxSize
     *
     * @return null|string
     */
    public function checkTitre(?string $titre, $maxSize = 100): ?string
    {
        if (null !== $titre) {
            $titre = trim($titre);
            $titre = iconv_substr($titre, 0, $maxSize);

            return trim($titre);
        }

        return null;
    }

    /**
     * Set audience.
     *
     * @param Audience $audience
     */
    public function setAudience(Audience $audience = null): void
    {
        $this->audience = $audience;
    }

    /**
     * Get audience.
     *
     * @return Audience|null
     */
    public function getAudience(): ?Audience
    {
        return $this->audience;
    }

    /**
     * Add nationalite.
     *
     * @param Nationalite $nationalite
     */
    public function addNationalite(Nationalite $nationalite): void
    {
        if (!$this->nationalites->contains($nationalite)) {
            $this->nationalites[] = $nationalite;
            $nationalite->addOeuvre($this);
        }
    }

    /**
     * Remove nationalite.
     *
     * @param Nationalite $nationalite
     */
    public function removeNationalite(Nationalite $nationalite): void
    {
        if ($this->nationalites->contains($nationalite)) {
            $this->nationalites->removeElement($nationalite);
            $nationalite->removeOeuvre($this);
        }
    }

    /**
     * Get nationalites.
     *
     * @return Collection
     */
    public function getNationalites(): Collection
    {
        return $this->nationalites;
    }

    /**
     * Add langue.
     *
     * @param Langue $langue
     */
    public function addLangue(Langue $langue): void
    {
        if (!$this->langues->contains($langue)) {
            $this->langues[] = $langue;
            $langue->addOeuvre($this);
        }
    }

    /**
     * Remove langue.
     *
     * @param Langue $langue
     */
    public function removeLangue(Langue $langue): void
    {
        if ($this->langues->contains($langue)) {
            $this->langues->removeElement($langue);
            $langue->removeOeuvre($this);
        }
    }

    /**
     * Get langues.
     *
     * @return Collection
     */
    public function getLangues(): Collection
    {
        return $this->langues;
    }

    /**
     * Set categorieOeuvre.
     *
     * @param CategorieOeuvre $categorieOeuvre
     */
    public function setCategorieOeuvre(
        CategorieOeuvre $categorieOeuvre = null
    ): void {
        $this->categorieOeuvre = $categorieOeuvre;
    }

    /**
     * Get categorieOeuvre.
     *
     * @return CategorieOeuvre
     */
    public function getCategorieOeuvre(): ?CategorieOeuvre
    {
        return $this->categorieOeuvre;
    }

    /**
     * Remove oeuvreCategorieArtiste.
     *
     * @param OeuvreCategorieArtiste $oeuvreCategorieArtiste
     */
    public function removeOeuvreCategorieArtiste(
        OeuvreCategorieArtiste $oeuvreCategorieArtiste
    ): void {
        if ($this->oeuvreCategorieArtistes->contains($oeuvreCategorieArtiste)) {
            $this->oeuvreCategorieArtistes->removeElement($oeuvreCategorieArtiste);
        }
        $oeuvreCategorieArtiste->setOeuvre(null);
    }

    /**
     * Add oeuvreCategorieArtiste.
     *
     * @param OeuvreCategorieArtiste $oeuvreCategorieArtiste
     */
    public function addOeuvreCategorieArtiste(
        OeuvreCategorieArtiste $oeuvreCategorieArtiste
    ): void {
        if (!$this->oeuvreCategorieArtistes->contains($oeuvreCategorieArtiste)) {
            $this->oeuvreCategorieArtistes[] = $oeuvreCategorieArtiste;
        }
        $oeuvreCategorieArtiste->setOeuvre($this);
    }

    /**
     * Get oeuvreCategorieArtistes.
     *
     * @return Collection
     */
    public function getOeuvreCategorieArtistes(): Collection
    {
        return $this->oeuvreCategorieArtistes;
    }

    /**
     * Set partie.
     *
     * @param Partie|null $partie
     */
    public function setPartie(Partie $partie = null): void
    {
        $this->partie = $partie;
    }

    /**
     * Get partie.
     *
     * @return Partie|null
     */
    public function getPartie(): ?Partie
    {
        return $this->partie;
    }

    /**
     * Add support.
     *
     * @param Support $support
     */
    public function addSupport(Support $support): void
    {
        if (!$this->supports->contains($support)) {
            $this->supports[] = $support;
            $support->addOeuvre($this);
        }
    }

    /**
     * Remove support.
     *
     * @param Support $support
     */
    public function removeSupport(Support $support): void
    {
        if ($this->supports->contains($support)) {
            $this->supports->removeElement($support);
            $support->removeOeuvre($this);
        }
    }

    /**
     * Get supports.
     *
     * @return Collection
     */
    public function getSupports(): Collection
    {
        return $this->supports;
    }

    /**
     * Add groupePrincipal.
     *
     * @param GroupePrincipal $groupePrincipal
     */
    public function addGroupePrincipal(GroupePrincipal $groupePrincipal): void
    {
        if (!$this->groupesPrincipaux->contains($groupePrincipal)) {
            $this->groupesPrincipaux[] = $groupePrincipal;
            $groupePrincipal->addOeuvre($this);
        }
    }

    /**
     * Remove groupePrincipal.
     *
     * @param GroupePrincipal $groupePrincipal
     */
    public function removeGroupePrincipal(GroupePrincipal $groupePrincipal): void
    {
        if ($this->groupesPrincipaux->contains($groupePrincipal)) {
            $this->groupesPrincipaux->removeElement($groupePrincipal);
            $groupePrincipal->removeOeuvre($this);
        }
    }

    /**
     * Get groupesPrincipaux.
     *
     * @return Collection
     */
    public function getGroupesPrincipaux(): Collection
    {
        return $this->groupesPrincipaux;
    }
}
