<?php

namespace App\Entity;

use App\Repository\EquipementTypeRepository;
use App\Utils\Functions;
use DateTime;
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\SerializedName;
use Symfony\Component\Serializer\Annotation\Groups;

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

    /**
     * @ORM\Column(type="string", length=8, nullable=true)
     * @Groups({"api", "site_list", "map", "planning"})
     */
    private $type;

    /**
     * @ORM\Column(type="string", length=50, nullable=true)
     * @Groups({"api", "site_list", "planning"})
     */
    private $libelle;

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

    private $dateDebut;
    private $dateFin;

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

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

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

    /**
     * @ORM\OneToMany(targetEntity=OptionTarif::class, mappedBy="equipement_type", orphanRemoval=true)
     * @Ignore()
     */
    private $optionTarifs;

    /**
     * @ORM\OneToMany(targetEntity=ClassificationEnergetique::class, mappedBy="equipement_type")
     */
    private $classificationEnergetiques;


    /** @SerializedName("equipement_puissance_IDs")
     * @Groups({"site_list"})
     */
    public function getEquipementPuissanceIDs() {
        $resultat= [];
        foreach ($this->getEquipementTypePuissances() as $typePuissance) {
            $resultat[] = $typePuissance->getEquipementPuissance()->getId();
        }
        return $resultat;
    }
    /** @SerializedName("option_IDs")
     * @Groups({"site_list"})
     */
    public function getOptionIDs() {
        $resultat= [];
        foreach ($this->getEquipementTypeOptions() as $typeOptions) {
            $resultat[] = $typeOptions->getOption()->getId();
        }
        return $resultat;
    }
    /** @SerializedName("equipement_famille_IDs")
     * @Groups({"site_list"})
     */
    public function getEquipementFamilleIDs() {
        $resultat= [];
        foreach ($this->getEquipementTypeFamilles() as $typeFamille) {
            $resultat[] = $typeFamille->getEquipementFamille()->getId();
        }
        return $resultat;
    }

    /** @SerializedName("date_debut")
     * @Groups({"site_list"})
     */
    public function getDateDebutSerializer() {
       foreach ($this->equipementTypeFamilles as $t) {
            return $t->getDebutFamille();
        }
        return null;
    }

    /** @SerializedName("date_fin")
     * @Groups({"site_list"})
     */
    public function getDateFinSerializer() {
        foreach ($this->equipementTypeFamilles as $t) {
           return $t->getFinFamille();
        }
        return null;
    }

    public function __construct()
    {
        $this->equipementTypeFamilles = new ArrayCollection();
        $this->equipementTypePuissances = new ArrayCollection();
        $this->equipementTypeOptions = new ArrayCollection();
        $this->optionTarifs = new ArrayCollection();
        $this->classificationEnergetiques = new ArrayCollection();
    }

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

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

        return $this;
    }

    public function getType(): ?string
    {
        return $this->type;
    }

    public function setType(?string $type): self
    {
        $this->type = $type;

        return $this;
    }

    public function getLibelle(): ?string
    {
        return $this->libelle;
    }

    public function setLibelle(?string $libelle): self
    {
        $this->libelle = $libelle;

        return $this;
    }

    public function getCtrlCo(): ?bool
    {
        return $this->ctrl_co;
    }

    public function setCtrlCo(?bool $ctrl_co): self
    {
        $this->ctrl_co = $ctrl_co;

        return $this;
    }

    /**
     * @return Collection|EquipementTypeFamille[]
     */
    public function getEquipementTypeFamilles(): Collection
    {
        return $this->equipementTypeFamilles;
    }

    public function addEquipementTypeFamille(EquipementTypeFamille $equipementTypeFamille): self
    {
        if (!$this->equipementTypeFamilles->contains($equipementTypeFamille)) {
            $this->equipementTypeFamilles[] = $equipementTypeFamille;
            $equipementTypeFamille->setEquipementType($this);
        }

        return $this;
    }

    public function removeEquipementTypeFamille(EquipementTypeFamille $equipementTypeFamille): self
    {
        if ($this->equipementTypeFamilles->removeElement($equipementTypeFamille)) {
            // set the owning side to null (unless already changed)
            if ($equipementTypeFamille->getEquipementType() === $this) {
                $equipementTypeFamille->setEquipementType(null);
            }
        }

        return $this;
    }

    public function setEquipementFamilleIDs($equipementsFamillesNew) {
        //on check les différences avec id actuel
        $equipementFamilleNow = [];
        foreach ($this->getEquipementTypeFamilles() as $equipementTypeFamille) {
            if (!in_array($equipementTypeFamille->getEquipementFamille(), $equipementsFamillesNew)) {
                $this->removeEquipementTypeFamille($equipementTypeFamille);
                continue;
            }
            $equipementFamilleNow[] = $equipementTypeFamille->getEquipementFamille();
        }

        $equipementsFamillesAdd = array_diff($equipementsFamillesNew, $equipementFamilleNow);

        foreach ($equipementsFamillesAdd as $equipementFamille) {
            $equipementTypeFamilleTmp = new EquipementTypeFamille();
            $equipementTypeFamilleTmp->setEquipementType($this);
            if ($this->getDateDebut()) $equipementTypeFamilleTmp->setDebutFamille($this->getDateDebut());
            if ($this->getDateFin()) $equipementTypeFamilleTmp->setFinFamille($this->getDateFin());
            $equipementTypeFamilleTmp->setEquipementFamille($equipementFamille);
            $this->addEquipementTypeFamille($equipementTypeFamilleTmp);
        }
    }

    public function updateFamilyDebut() {
        foreach ($this->equipementTypeFamilles as $equipementTypeFamille) {
            $equipementTypeFamille->setDebutFamille($this->getDateDebut());
        }
    }

    public function updateFamilyFin() {
        foreach ($this->equipementTypeFamilles as $equipementTypeFamille) {
            $equipementTypeFamille->setFinFamille($this->getDateFin());
        }
    }

    /**
     * @return Collection|EquipementTypePuissance[]
     */
    public function getEquipementTypePuissances(): Collection
    {
        return $this->equipementTypePuissances;
    }

    public function addEquipementTypePuissance(EquipementTypePuissance $equipementTypePuissance): self
    {
        if (!$this->equipementTypePuissances->contains($equipementTypePuissance)) {
            $this->equipementTypePuissances[] = $equipementTypePuissance;
            $equipementTypePuissance->setEquipementType($this);
        }

        return $this;
    }

    public function removeEquipementTypePuissance(EquipementTypePuissance $equipementTypePuissance): self
    {
        if ($this->equipementTypePuissances->removeElement($equipementTypePuissance)) {
            // set the owning side to null (unless already changed)
            if ($equipementTypePuissance->getEquipementType() === $this) {
                $equipementTypePuissance->setEquipementType(null);
            }
        }

        return $this;
    }

    public function setEquipementPuissanceIDs($puissancesNew) {
        //on check les différences avec id actuel
        $puissancesNow = [];
        foreach ($this->getEquipementTypePuissances() as $equipementTypePuissance) {
            if (!in_array($equipementTypePuissance->getEquipementPuissance(), $puissancesNew)) {
                $this->removeEquipementTypePuissance($equipementTypePuissance);
                continue;
            }
            $puissancesNow[] = $equipementTypePuissance->getEquipementPuissance();
        }

        $equipementsPuissancesAdd = array_diff($puissancesNew, $puissancesNow);

        foreach ($equipementsPuissancesAdd as $equipementPuissance) {
            $equipementTypePuissanceTmp = new EquipementTypePuissance();
            $equipementTypePuissanceTmp->setEquipementType($this);
            $equipementTypePuissanceTmp->setEquipementPuissance($equipementPuissance);
            $this->addEquipementTypePuissance($equipementTypePuissanceTmp);
        }
    }

    /**
     * @return Collection|EquipementTypeOption[]
     */
    public function getEquipementTypeOptions(): Collection
    {
        return $this->equipementTypeOptions;
    }

    public function addEquipementTypeOption(EquipementTypeOption $equipementTypeOption): self
    {
        if (!$this->equipementTypeOptions->contains($equipementTypeOption)) {
            $this->equipementTypeOptions[] = $equipementTypeOption;
            $equipementTypeOption->setEquipementType($this);
        }

        return $this;
    }

    public function removeEquipementTypeOption(EquipementTypeOption $equipementTypeOption): self
    {
        if ($this->equipementTypeOptions->removeElement($equipementTypeOption)) {
            // set the owning side to null (unless already changed)
            if ($equipementTypeOption->getEquipementType() === $this) {
                $equipementTypeOption->setEquipementType(null);
            }
        }

        return $this;
    }

    public function setOptionIDs($optionsNew) {
        //on check les différences avec id actuel
        $optionsNow = [];
        foreach ($this->getEquipementTypeOptions() as $equipementTypeOption) {
            if (!in_array($equipementTypeOption->getOption(), $optionsNew)) {
                $this->removeEquipementTypeOption($equipementTypeOption);
                continue;
            }
            $optionsNow[] = $equipementTypeOption->getOption();
        }

        $equipementsOptionsAdd = array_diff($optionsNew, $optionsNow);

        foreach ($equipementsOptionsAdd as $equipementOption) {
            $equipementTypeOptionTmp = new EquipementTypeOption();
            $equipementTypeOptionTmp->setEquipementType($this);
            $equipementTypeOptionTmp->setOption($equipementOption);
            $this->addEquipementTypeOption($equipementTypeOptionTmp);
        }

    }

    /**
     * @return Collection|OptionTarif[]
     */
    public function getOptionTarifs(): Collection
    {
        return $this->optionTarifs;
    }

    public function addOptionTarif(OptionTarif $optionTarif): self
    {
        if (!$this->optionTarifs->contains($optionTarif)) {
            $this->optionTarifs[] = $optionTarif;
            $optionTarif->setEquipementType($this);
        }

        return $this;
    }

    public function removeOptionTarif(OptionTarif $optionTarif): self
    {
        if ($this->optionTarifs->removeElement($optionTarif)) {
            // set the owning side to null (unless already changed)
            if ($optionTarif->getEquipementType() === $this) {
                $optionTarif->setEquipementType(null);
            }
        }

        return $this;
    }

    /**
     * @return mixed
     */
    public function getDateDebut()
    {
        if ($this->dateDebut  !== null) {
            if ($this->dateDebut == '') return null;
            else return $this->dateDebut;
        } else return $this->getDateDebutSerializer();
    }

    /**
     * @param mixed $dateDebut
     */
    public function setDateDebut($dateDebut)
    {
        if (is_string($dateDebut)) {
            $this->dateDebut =  Functions::getDateTimeFromString($dateDebut);
        } else{
            $this->dateDebut = $dateDebut;
        }
    }

    /**
     * @return mixed
     */
    public function getDateFin()
    {
        if ($this->dateFin  !== null) {
            if ($this->dateFin == '') return null;
            else return $this->dateFin;
        } else return $this->getDateFinSerializer();
    }

    /**
     * @param mixed $dateFin
     */
    public function setDateFin($dateFin)
    {
       if (is_string($dateFin)) {
           $this->dateFin =  Functions::getDateTimeFromString($dateFin);
        } else{
           $this->dateFin = $dateFin;
       }
    }

    /**
     * @return Collection<int, ClassificationEnergetique>
     */
    public function getClassificationEnergetiques(): Collection
    {
        return $this->classificationEnergetiques;
    }

    public function addClassificationEnergetique(ClassificationEnergetique $classificationEnergetique): self
    {
        if (!$this->classificationEnergetiques->contains($classificationEnergetique)) {
            $this->classificationEnergetiques[] = $classificationEnergetique;
            $classificationEnergetique->setEquipementType($this);
        }

        return $this;
    }

    public function removeClassificationEnergetique(ClassificationEnergetique $classificationEnergetique): self
    {
        if ($this->classificationEnergetiques->removeElement($classificationEnergetique)) {
            // set the owning side to null (unless already changed)
            if ($classificationEnergetique->getEquipementType() === $this) {
                $classificationEnergetique->setEquipementType(null);
            }
        }

        return $this;
    }

}
