<?php

namespace App\Entity;

use App\Repository\EquipementRepository;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping as ORM;
use PhpOffice\PhpSpreadsheet\Shared\Date;
use Symfony\Component\Serializer\Annotation\Ignore;
use Symfony\Component\Serializer\Annotation\Groups;
use Symfony\Component\Serializer\Annotation\SerializedName;
use DateTime;

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

    /**
     * @ORM\OneToMany(targetEntity=EquipementOption::class, mappedBy="equipement", orphanRemoval=true,  cascade={"persist"})
     * @Groups({"api"})
     */
    private $equipementOptions;

    /**
     * @ORM\ManyToOne(targetEntity=Client::class, inversedBy="equipements", cascade={"persist"})
     * @ORM\JoinColumn(name="idclient_souscripteur")
     * @Groups({"api", "map", "planning"})
     */
    private $client_souscripteur;

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

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

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

    /**
     * @ORM\ManyToOne(targetEntity=EquipementTypePuissance::class, inversedBy="equipements")
     * @ORM\JoinColumn(name="idequipement_type_puissance")
     * @Groups({"api", "map", "planning"})
     */
    private $equipement_type_puissance;

    /**
     * @ORM\ManyToOne(targetEntity=Energie::class, inversedBy="equipements")
     * @ORM\JoinColumn(name="idenergie")
     * @Groups({"api"})
     */
    private $energie;

    /**
     * @ORM\ManyToOne(targetEntity=EquipementTranche::class, inversedBy="equipements")
     * @ORM\JoinColumn(name="idequipement_tranche")
     * @Groups({"api"})
     */
    private $equipement_tranche;

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

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

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

    /**
     * @ORM\ManyToOne(targetEntity=Adresse::class, inversedBy="equipements", cascade={"persist"})
     * @ORM\JoinColumn(name="idadresse")
     * @Groups({"api", "map", "planning"})
     */
    private $adresse;

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

    /**
     * @ORM\ManyToOne(targetEntity=EquipementFamilleContrat::class, inversedBy="equipements")
     * @ORM\JoinColumn(name="idequipement_famille_contrat")
     * @Groups({"api", "planning"})
     */
    private $equipement_famille_contrat;

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

    /**
     * @ORM\ManyToOne(targetEntity=EquipementLocal::class, inversedBy="equipements")
     * @ORM\JoinColumn(name="idequipement_local")
     * @Groups({"api"})
     */
    private $equipement_local;

    /**
     * @ORM\ManyToOne(targetEntity=Raccordement::class, inversedBy="equipements")
     * @ORM\JoinColumn(name="idraccordement")
     * @Groups({"api"})
     */
    private $raccordement;

    /**
     * @ORM\ManyToOne(targetEntity=Installateur::class, inversedBy="equipements")
     * @ORM\JoinColumn(name="idinstallateur")
     * @Groups({"api"})
     */
    private $installateur;

    /**
     * @ORM\ManyToOne(targetEntity=TauxTva::class, inversedBy="equipements")
     * @ORM\JoinColumn(name="idtaux_tva")
     * @Groups({"api"})
     */
    private $taux_tva;

    /**
     * @ORM\ManyToOne(targetEntity=Client::class, inversedBy="equipements_client_utilisateur")
     * @ORM\JoinColumn(name="idclient_utilisateur")
     * @Groups({"api", "map", "planning"})
     */
    private $client_utilisateur;

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

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

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

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

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

    /**
     * @ORM\Column(type="string", length=30, nullable=true)
     */
    private $numero_client_oracle;

    /**
     * @ORM\OneToMany(targetEntity=Contrat::class, mappedBy="equipement")
     */
    private $contrats;

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

    /**
     * @ORM\OneToMany(targetEntity=Privilege::class, mappedBy="equipement")
     * @Ignore()
     */
    private $privileges;

    /**
     * @ORM\ManyToOne(targetEntity=EquipementFamille::class, inversedBy="equipements")
     * @ORM\JoinColumn(name="idequipement_famille")
     * @Groups({"api", "planning"})
     */
    private $equipement_famille;

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

    /**
     * @ORM\OneToMany(targetEntity=EquipementInstallation::class, mappedBy="equipement", orphanRemoval=true)
     * @Groups({"api"})
     */
    private $equipementInstallations;

    /**
     * @ORM\OneToMany(targetEntity=EquipementComplement::class, mappedBy="equipement", orphanRemoval=true, cascade={"persist"})
     * @Groups({"api"})
     */
    private $equipementComplements;

    /**
     * @ORM\OneToMany(targetEntity=EquipementZone::class, mappedBy="equipement", orphanRemoval=true)
     * @ORM\OrderBy({"numero" = "ASC"})
     * @Groups({"api"})
     */
    private $equipementZones;

    /**
     * @ORM\OneToMany(targetEntity=EquipementMesure::class, mappedBy="equipement", orphanRemoval=true)
     * @Ignore()
     */
    private $equipementMesures;

    /**
     * @ORM\OneToMany(targetEntity=AttestationEntretien::class, mappedBy="equipement", cascade={"persist"})
     */
    private $attestationEntretiens;
    
    /**
     * @ORM\OneToMany(targetEntity=EquipementGroupe::class, mappedBy="equipement", orphanRemoval=true,  cascade={"persist"})
     * @Ignore()
     */
    private $equipementGroupes;

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

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

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

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

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

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

    /**
     * @ORM\OneToOne(targetEntity=EquipementPreferencesPlanification::class, mappedBy="equipement", orphanRemoval=true,  cascade={"persist"}, fetch="EXTRA_LAZY")
     * @Ignore()
     */
    private $equipementPreferencesPlanification;

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

    /**
     * @ORM\Column(type="date", nullable=true)
     * @Groups({"planning"})
     */
    private $date_derniere_v1;

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

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

    /**
     * @ORM\OneToMany(targetEntity=HistoriqueEquipementLocal::class, mappedBy="equipement", orphanRemoval=true)
     * @Ignore()
     */
    private $historiqueEquipementLocals;

    /**
     * @ORM\OneToMany(targetEntity=HistoriqueEquipementUtilisateur::class, mappedBy="equipement", orphanRemoval=true)
     * @Ignore()
     */
    private $historiqueEquipementUtilisateurs;

    /**
     * @ORM\ManyToOne(targetEntity=Client::class)
     * @ORM\JoinColumn(name="idclient_ancien_souscripteur")
     */
    private $client_ancien_souscripteur;

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

    /**
     * @ORM\OneToMany(targetEntity=EquipementHauteur::class, mappedBy="equipement")
     * @Ignore()
     */
    private $equipementHauteurs;

    /**
     * @ORM\ManyToOne(targetEntity=EquipementAlimentation::class, inversedBy="equipements")
     * @ORM\JoinColumn(name="idequipement_alimentation")
     */
    private $equipement_alimentation;

    /**
     * @ORM\ManyToOne(targetEntity=EquipementFluide::class, inversedBy="equipements")
     * @ORM\JoinColumn(name="idequipement_fluide")
     */
    private $equipement_fluide;

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

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

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

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

    /**
     * @ORM\ManyToOne(targetEntity=EquipementReleve::class, inversedBy="equipements")
     * @ORM\JoinColumn(name="idequipement_releve")
     */
    private $equipement_releve;

    /**
     * @ORM\ManyToOne(targetEntity=Equipement::class, inversedBy="equipements")
     * @ORM\JoinColumn(nullable=false, name="idequipement_ancien")
     */
    private $equipement_ancien;

    /**
     * @ORM\OneToMany(targetEntity=OldBlocNoteClient::class, mappedBy="equipement")
     * @Ignore()
    */
    private $oldBlocNoteClients;

    /**
     * @ORM\OneToMany(targetEntity=PlanningHistoriqueModification::class, mappedBy="equipement")
     */
    private $planningHistoriqueModifications;

    public function __construct()
    {
        $this->interventions = new ArrayCollection();
        $this->equipementOptions = new ArrayCollection();
        $this->contrats = new ArrayCollection();
        $this->factures = new ArrayCollection();
        $this->privileges = new ArrayCollection();
        $this->equipementInstallations = new ArrayCollection();
        $this->equipementComplements = new ArrayCollection();
        $this->equipementZones = new ArrayCollection();
        $this->equipementMesures = new ArrayCollection();
        $this->attestationEntretiens = new ArrayCollection();
        $this->equipementGroupes = new ArrayCollection();
        $this->secteurEquipements = new ArrayCollection();
        $this->plannings = new ArrayCollection();
        $this->historiqueEquipementLocals = new ArrayCollection();
        $this->historiqueEquipementUtilisateurs = new ArrayCollection();
        $this->equipementHauteurs = new ArrayCollection();
        $this->oldBlocNoteClients = new ArrayCollection();
        $this->planningHistoriqueModifications = new ArrayCollection();
    }

    public function __clone()
    {
        if ($this->id)
        {
            $this->setId(null);
        }
        // cloning everything
        $equipementsComplements = new ArrayCollection();
        $equipementZones = new ArrayCollection();
        $secteurEquipements = new ArrayCollection();
        $equipementOptions = new ArrayCollection();
        foreach ($this->equipementComplements as $equipementComplement)
        {
            $equipementComplementClone = clone $equipementComplement;
            $equipementComplementClone->setEquipement($this);
            $equipementsComplements->add($equipementComplementClone);
        }
        foreach ($this->equipementZones as $equipementZone)
        {
            $equipementZoneClone = clone $equipementZone;
            $equipementZoneClone->setEquipement($this);
            $equipementZones->add($equipementZoneClone);
        }
        foreach ($this->secteurEquipements as $secteurEquipement)
        {
            $secteurEquipementClone = clone $secteurEquipement;
            $secteurEquipementClone->setEquipement($this);
            $secteurEquipements->add($secteurEquipementClone);
        }
        foreach ($this->equipementOptions as $equipementOption)
        {
            $equipementOptionClone = clone $equipementOption;
            $equipementOptionClone->setEquipement($this);
            $equipementOptions->add($equipementOptionClone);
        }
        $this->equipementComplements = $equipementsComplements;
        $this->equipementZones = $equipementZones;
        $this->secteurEquipements = $secteurEquipements;
        $this->equipementOptions = $equipementOptions;

        $this->interventions = new ArrayCollection();
        $this->contrats = new ArrayCollection();
        $this->factures = new ArrayCollection();
        $this->privileges = new ArrayCollection();
        $this->plannings = new ArrayCollection();
        $this->equipementInstallations = new ArrayCollection();
        $this->equipementMesures = new ArrayCollection();
        $this->attestationEntretiens = new ArrayCollection();
        $this->equipementGroupes = new ArrayCollection();

    }


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

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

        return $this;
    }

    /**
     * @return Collection|EquipementOption[]
     */
    public function getEquipementOptions(): Collection
    {
        return $this->equipementOptions;
    }

    public function getOptions() {
        $result = [];
        if ($this->getEquipementOptions()) {
            foreach ($this->getEquipementOptions() as $equipementOption) {
                $result[] = $equipementOption->getOption();
            }
        }
        return $result;
    }

    public function getArrayOptions() {
        return  $this->equipementOptions->map(function($equipementOption) {
            return (string)$equipementOption;
        })->toArray();
    }

    public function getOptionsId() {
        $result = [];
        if ($this->getEquipementOptions()) {
            foreach ($this->getEquipementOptions() as $equipementOption) {
                $result[] = $equipementOption->getOption()->getId();
            }
        }
        return $result;
    }

    public function addEquipementOption(EquipementOption $equipementOption): self
    {
        if (!$this->equipementOptions->contains($equipementOption)) {
            $this->equipementOptions[] = $equipementOption;
            $equipementOption->setEquipement($this);
        }

        return $this;
    }

    public function removeEquipementOption(EquipementOption $equipementOption): self
    {
        if ($this->equipementOptions->removeElement($equipementOption)) {
            // set the owning side to null (unless already changed)
            if ($equipementOption->getEquipement() === $this) {
                $equipementOption->setEquipement(null);
            }
        }

        return $this;
    }

    public function getClientSouscripteur(): ?Client
    {
        return $this->client_souscripteur;
    }

    public function setClientSouscripteur(?Client $client_souscripteur): self
    {
        $this->client_souscripteur = $client_souscripteur;

        return $this;
    }

    public function getNumSeriePrincipal(): ?string
    {
        return $this->num_serie_principal;
    }

    public function setNumSeriePrincipal(string $num_serie_principal): self
    {
        $this->num_serie_principal = $num_serie_principal;

        return $this;
    }

    public function getNumSerieSecondaire(): ?string
    {
        return $this->num_serie_secondaire;
    }

    public function setNumSerieSecondaire(?string $num_serie_secondaire): self
    {
        $this->num_serie_secondaire = $num_serie_secondaire;

        return $this;
    }

    public function getNumUpec(): ?string
    {
        return $this->num_upec;
    }

    public function setNumUpec(?string $num_upec): self
    {
        $this->num_upec = $num_upec;

        return $this;
    }

    public function getEquipementTypePuissance(): ?EquipementTypePuissance
    {
        return $this->equipement_type_puissance;
    }

    public function setEquipementTypePuissance(?EquipementTypePuissance $equipement_type_puissance): self
    {
        $this->equipement_type_puissance = $equipement_type_puissance;

        return $this;
    }

    public function getEnergie(): ?Energie
    {
        return $this->energie;
    }

    public function setEnergie(?Energie $energie): self
    {
        $this->energie = $energie;

        return $this;
    }

    public function getEquipementTranche(): ?EquipementTranche
    {
        return $this->equipement_tranche;
    }

    public function setEquipementTranche(?EquipementTranche $equipement_tranche): self
    {
        $this->equipement_tranche = $equipement_tranche;

        return $this;
    }

    public function getLogementPlus2Ans(): ?bool
    {
        return $this->logement_plus_2_ans;
    }

    public function setLogementPlus2Ans(bool $logement_plus_2_ans): self
    {
        $this->logement_plus_2_ans = $logement_plus_2_ans;

        return $this;
    }

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

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

        return $this;
    }

    public function getActif(): ?bool
    {
        return $this->actif;
    }

    public function setActif(?bool $actif): self
    {
        $this->actif = $actif;

        return $this;
    }

    public function getAdresse(): ?Adresse
    {
        return $this->adresse;
    }

    public function setAdresse(?Adresse $adresse): self
    {
        $this->adresse = $adresse;

        return $this;
    }

    public function getSalarieFrisquet(): ?bool
    {
        return $this->salarie_frisquet;
    }

    public function setSalarieFrisquet(?bool $salarie_frisquet): self
    {
        $this->salarie_frisquet = $salarie_frisquet;

        return $this;
    }

    public function getEquipementFamilleContrat(): ?EquipementFamilleContrat
    {
        return $this->equipement_famille_contrat;
    }

    public function setEquipementFamilleContrat(?EquipementFamilleContrat $equipement_famille_contrat): self
    {
        $this->equipement_famille_contrat = $equipement_famille_contrat;

        return $this;
    }

    public function getLieuSiAutre(): ?string
    {
        return $this->lieu_si_autre;
    }

    public function setLieuSiAutre(?string $lieu_si_autre): self
    {
        $this->lieu_si_autre = $lieu_si_autre;

        return $this;
    }

    public function getEquipementLocal(): ?EquipementLocal
    {
        return $this->equipement_local;
    }

    public function setEquipementLocal(?EquipementLocal $equipement_local): self
    {
        $this->equipement_local = $equipement_local;

        return $this;
    }

    public function getSecteur(): ?Secteur
    {
        foreach ($this->secteurEquipements as $secteurEquipement) {
            if ($secteurEquipement->getSecteur()->getSectorisationVersion()->getEnProd() == true)
                return $secteurEquipement->getSecteur();
        }
        return null;
    }

    public function getRaccordement(): ?Raccordement
    {
        return $this->raccordement;
    }

    public function setRaccordement(?Raccordement $raccordement): self
    {
        $this->raccordement = $raccordement;

        return $this;
    }

    public function getInstallateur(): ?Installateur
    {
        return $this->installateur;
    }

    public function setInstallateur(?Installateur $installateur): self
    {
        $this->installateur = $installateur;

        return $this;
    }

    public function getTauxTva(): ?TauxTva
    {
        return $this->taux_tva;
    }

    public function setTauxTva(?TauxTva $taux_tva): self
    {
        $this->taux_tva = $taux_tva;

        return $this;
    }

    public function getClientUtilisateur(): ?Client
    {
        return $this->client_utilisateur;
    }

    public function setClientUtilisateur(?Client $client_utilisateur): self
    {
        $this->client_utilisateur = $client_utilisateur;

        return $this;
    }

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

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

        return $this;
    }

    public function getChantier(): ?int
    {
        return $this->chantier;
    }

    public function setChantier($chantier): self
    {
        $this->chantier = $chantier;

        return $this;
    }

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

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

        return $this;
    }

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

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

        return $this;
    }

    /**
     * @return Collection<int, Contrat>
     */
    public function getContrats(): Collection
    {
        return $this->contrats;
    }

    public function addContrat(Contrat $contrat): self
    {
        if (!$this->contrats->contains($contrat)) {
            $this->contrats[] = $contrat;
            $contrat->setEquipement($this);
        }

        return $this;
    }

    public function removeContrat(Contrat $contrat): self
    {
        if ($this->contrats->removeElement($contrat)) {
            // set the owning side to null (unless already changed)
            if ($contrat->getEquipement() === $this) {
                $contrat->setEquipement(null);
            }
        }

        return $this;
    }

    /**
     * @SerializedName("contrat_en_cours")
     * @Groups({"api", "map", "planning"})
     */
    public function getLastContrat(): ?Contrat
    {
        $now = new DateTime();
        foreach ($this->contrats as $contrat) {
            if (
                $contrat->getContratType() &&
                $contrat->getDernierContrat() == true
            )
                return $contrat;
        }
        return null;
    }

    public function getContratAvenir(): ?Contrat
    {
        $now = new DateTime();
        foreach ($this->contrats as $contrat) {
            if (
                $contrat->getContratType() &&
                $contrat->getContratAvenir() == true
            )
                return $contrat;
        }
        return null;
    }

    public function getLastPrivilege(): ?Privilege
    {
       return ($last = $this->privileges->last()) ?  $last : null;
    }

    /**
     * @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->setEquipement($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->getEquipement() === $this) {
                $facture->setEquipement(null);
            }
        }

        return $this;
    }

    /**
     * @return Collection<int, Privilege>
     */
    public function getPrivileges(): Collection
    {
        return $this->privileges;
    }

    public function addPrivilege(Privilege $privilege): self
    {
        if (!$this->privileges->contains($privilege)) {
            $this->privileges[] = $privilege;
            $privilege->setEquipement($this);
        }

        return $this;
    }

    public function removePrivilege(Privilege $privilege): self
    {
        if ($this->privileges->removeElement($privilege)) {
            // set the owning side to null (unless already changed)
            if ($privilege->getEquipement() === $this) {
                $privilege->setEquipement(null);
            }
        }

        return $this;
    }

    public function isEligiblePrivilege(): bool
    {
        $now = new \DateTime();
        return $this->dateEligiblePrivilege !== null 
            && $this->dateEligiblePrivilege <= $now 
            && $this->remplacement_privilege !== true;
    }

    public function getEquipementFamille(): ?EquipementFamille
    {
        return $this->equipement_famille;
    }

    public function setEquipementFamille(?EquipementFamille $equipement_famille): self
    {
        $this->equipement_famille = $equipement_famille;

        return $this;
    }

    public function getNumeroClientOracle(): ?int
    {
        return $this->numero_client_oracle;
    }

    public function setNumeroClientOracle(?int $numero_client_oracle): self
    {
        $this->numero_client_oracle = $numero_client_oracle;

        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->setEquipement($this);
        }

        return $this;
    }

    public function getMES() {
        foreach ($this->interventions as $intervention) {
            if ($intervention->getTypePlanification() && $intervention->getTypePlanification()->getId() ==  TypePlanification::ID_TYPE_VISITE_MES) return $intervention;
        }
    }

    public function getInterventionPriseContrat() {
        foreach ($this->factures as $facture) {
            if ($facture->getPriseContrat()) return $facture->getIntervention();
        }
    }

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

        return $this;
    }

    public function getAge() {
        $now = new DateTime();
        $interval = null;
        if ($this->getDatePremierAllumage()) {
            $interval = $this->getDatePremierAllumage()->diff($now);
        } else {
            if ($this->getNumSeriePrincipal()) {
                $year = substr($this->getNumSeriePrincipal(), 0 ,2);
                $week = substr($this->getNumSeriePrincipal(),2,2);
                if ($year > $now->format('y')) $year = '19' . $year;
                else $year = '20'.$year;

                $date = (new DateTime())->setISODate($year, $week);
                $interval = $date->diff($now);
            }
        }
        return ($interval != null && $interval->y != 0) ? $interval->y : 1;
    }

    /**
     * @return Collection<int, EquipementInstallation>
     */
    public function getEquipementInstallations(): Collection
    {
        return $this->equipementInstallations;
    }

    public function addEquipementInstallation(EquipementInstallation $equipementInstallation): self
    {
        if (!$this->equipementInstallations->contains($equipementInstallation)) {
            $this->equipementInstallations[] = $equipementInstallation;
            $equipementInstallation->setEquipement($this);
        }

        return $this;
    }

    public function removeEquipementInstallation(EquipementInstallation $equipementInstallation): self
    {
        if ($this->equipementInstallations->removeElement($equipementInstallation)) {
            // set the owning side to null (unless already changed)
            if ($equipementInstallation->getEquipement() === $this) {
                $equipementInstallation->setEquipement(null);
            }
        }

        return $this;
    }

    /**
     * @return Collection<int, EquipementComplement>
     */
    public function getEquipementComplements(): Collection
    {
        return $this->equipementComplements;
    }

    public function addEquipementComplement(EquipementComplement $equipementComplement): self
    {
        if (!$this->equipementComplements->contains($equipementComplement)) {
            $this->equipementComplements[] = $equipementComplement;
            $equipementComplement->setEquipement($this);
        }

        return $this;
    }

    public function removeEquipementComplement(EquipementComplement $equipementComplement): self
    {
        if ($this->equipementComplements->removeElement($equipementComplement)) {
            // set the owning side to null (unless already changed)
            if ($equipementComplement->getEquipement() === $this) {
                $equipementComplement->setEquipement(null);
            }
        }

        return $this;
    }

    /**
     * @return Collection<int, EquipementZone>
     */
    public function getEquipementZones(): Collection
    {
        return $this->equipementZones;
    }

    public function addEquipementZone(EquipementZone $equipementZone): self
    {
        if (!$this->equipementZones->contains($equipementZone)) {
            $this->equipementZones[] = $equipementZone;
            $equipementZone->setEquipement($this);
        }

        return $this;
    }

    public function removeEquipementZone(EquipementZone $equipementZone): self
    {
        if ($this->equipementZones->removeElement($equipementZone)) {
            // set the owning side to null (unless already changed)
            if ($equipementZone->getEquipement() === $this) {
                $equipementZone->setEquipement(null);
            }
        }

        return $this;
    }

    /**
     * @return Collection<int, EquipementMesure>
     */
    public function getEquipementMesures(): Collection
    {
        return $this->equipementMesures;
    }

    public function addEquipementMesure(EquipementMesure $equipementMesure): self
    {
        if (!$this->equipementMesures->contains($equipementMesure)) {
            $this->equipementMesures[] = $equipementMesure;
            $equipementMesure->setEquipement($this);
        }

        return $this;
    }

    public function removeEquipementMesure(EquipementMesure $equipementMesure): self
    {
        if ($this->equipementMesures->removeElement($equipementMesure)) {
            // set the owning side to null (unless already changed)
            if ($equipementMesure->getEquipement() === $this) {
                $equipementMesure->setEquipement(null);
            }
        }

        return $this;
    }

    /**
     * @return Collection<int, AttestationEntretien>
     */
    public function getAttestationEntretiens(): Collection
    {
        return $this->attestationEntretiens;
    }

    public function addAttestationEntretien(AttestationEntretien $attestationEntretien): self
    {
        if (!$this->attestationEntretiens->contains($attestationEntretien)) {
            $this->attestationEntretiens[] = $attestationEntretien;
            $attestationEntretien->setEquipement($this);
        }

        return $this;
    }
    
    /**
     * @return Collection<int, EquipementGroupe>
     */
    public function getEquipementGroupes(): Collection
    {
        return $this->equipementGroupes;
    }

    public function addEquipementGroupe(EquipementGroupe $equipementGroupe): self
    {
        if (!$this->equipementGroupes->contains($equipementGroupe)) {
            $this->equipementGroupes[] = $equipementGroupe;
            $equipementGroupe->setEquipement($this);
        }

        return $this;
    }

    public function removeAttestationEntretien(AttestationEntretien $attestationEntretien): self
    {
        if ($this->attestationEntretiens->removeElement($attestationEntretien)) {
            // set the owning side to null (unless already changed)
            if ($attestationEntretien->getEquipement() === $this) {
                $attestationEntretien->setEquipement(null);
            }
        }

        return $this;
    }
                
    public function removeEquipementGroupe(EquipementGroupe $equipementGroupe): self
    {
        if ($this->equipementGroupes->removeElement($equipementGroupe)) {
            // set the owning side to null (unless already changed)
            if ($equipementGroupe->getEquipement() === $this) {
                $equipementGroupe->setEquipement(null);
            }
        }

        return $this;
    }


    /**
     * @SerializedName("privilege")
     * @Groups({"api"})
     */
    public function getPrivilege() : bool
    {
        if ($this->dateEligiblePrivilege instanceof DateTime) {
            return $this->dateEligiblePrivilege >= new DateTime();
        }
        return false;
    }

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

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

        return $this;
    }

    /**
     * @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->setEquipement($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->getEquipement() === $this) {
                $secteurEquipement->setEquipement(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->setEquipement($this);
        }

        return $this;
    }
    public function getEquipementPreferencesPlanification()
    {
        return $this->equipementPreferencesPlanification;
    }

    public function setEquipementPreferencesPlanification(?self $equipementPreferencesPlanification): self
    {
        $this->equipementPreferencesPlanification = $equipementPreferencesPlanification;

        return $this;
    }

    public function getLogementVide(): ?bool
    {
        return $this->logement_vide;
    }

    public function setLogementVide(bool $logement_vide): self
    {
        $this->logement_vide = $logement_vide;

        return $this;
    }

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

    public function setDateDerniereV1(?\DateTimeInterface $date_derniere_v1): self
    {
        $this->date_derniere_v1 = $date_derniere_v1;
        return $this;
    }

    public function getCommentaireDesactivation(): ?string
    {
        return $this->commentaire_desactivation;
    }

    public function setCommentaireDesactivation(?string $commentaire_desactivation): self
    {
        $this->commentaire_desactivation = $commentaire_desactivation;
        return $this;
    }
    public function getInstallateurObservation(): ?string
    {
        return $this->installateur_observation;
    }

    public function setInstallateurObservation(?string $installateur_observation): self
    {
        $this->installateur_observation = $installateur_observation;

        return $this;
    }

    /**
     * @return Collection<int, HistoriqueEquipementLocal>
     */
    public function getHistoriqueEquipementLocals(): Collection
    {
        return $this->historiqueEquipementLocals;
    }

    public function addHistoriqueEquipementLocal(HistoriqueEquipementLocal $historiqueEquipementLocal): self
    {
        if (!$this->historiqueEquipementLocals->contains($historiqueEquipementLocal)) {
            $this->historiqueEquipementLocals[] = $historiqueEquipementLocal;
            $historiqueEquipementLocal->setEquipement($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->getEquipement() === $this) {
                $planning->setEquipement(null);
            }
        }

        return $this;
    }

    public function removeHistoriqueEquipementLocal(HistoriqueEquipementLocal $historiqueEquipementLocal): self
    {
        if ($this->historiqueEquipementLocals->removeElement($historiqueEquipementLocal)) {
            // set the owning side to null (unless already changed)
            if ($historiqueEquipementLocal->getEquipement() === $this) {
                $historiqueEquipementLocal->setEquipement(null);
            }
        }

        return $this;
    }

    /**
     * @return Collection<int, HistoriqueEquipementUtilisateur>
     */
    public function getHistoriqueEquipementUtilisateurs(): Collection
    {
        return $this->historiqueEquipementUtilisateurs;
    }

    public function addHistoriqueEquipementUtilisateur(HistoriqueEquipementUtilisateur $historiqueEquipementUtilisateur): self
    {
        if (!$this->historiqueEquipementUtilisateurs->contains($historiqueEquipementUtilisateur)) {
            $this->historiqueEquipementUtilisateurs[] = $historiqueEquipementUtilisateur;
            $historiqueEquipementUtilisateur->setEquipement($this);
        }

        return $this;
    }

    public function removeHistoriqueEquipementUtilisateur(HistoriqueEquipementUtilisateur $historiqueEquipementUtilisateur): self
    {
        if ($this->historiqueEquipementUtilisateurs->removeElement($historiqueEquipementUtilisateur)) {
            // set the owning side to null (unless already changed)
            if ($historiqueEquipementUtilisateur->getEquipement() === $this) {
                $historiqueEquipementUtilisateur->setEquipement(null);
            }
        }

        return $this;
    }

    public function getClientAncienSouscripteur(): ?Client
    {
        return $this->client_ancien_souscripteur;
    }

    public function setClientAncienSouscripteur(?Client $client_ancien_souscripteur): self
    {
        $this->client_ancien_souscripteur = $client_ancien_souscripteur;

        return $this;
    }

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

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

        return $this;
    }

    /**
     * @return Collection<int, EquipementHauteur>
     */
    public function getEquipementHauteurs(): Collection
    {
        return $this->equipementHauteurs;
    }

    public function addEquipementHauteur(EquipementHauteur $equipementHauteur): self
    {
        if (!$this->equipementHauteurs->contains($equipementHauteur)) {
            $this->equipementHauteurs[] = $equipementHauteur;
            $equipementHauteur->setEquipement($this);
        }

        return $this;
    }

    public function removeEquipementHauteur(EquipementHauteur $equipementHauteur): self
    {
        if ($this->equipementHauteurs->removeElement($equipementHauteur)) {
            // set the owning side to null (unless already changed)
            if ($equipementHauteur->getEquipement() === $this) {
                $equipementHauteur->setEquipement(null);
            }
        }

        return $this;
    }

    public function getEquipementAlimentation(): ?EquipementAlimentation
    {
        return $this->equipement_alimentation;
    }

    public function setEquipementAlimentation(?EquipementAlimentation $equipement_alimentation): self
    {
        $this->equipement_alimentation = $equipement_alimentation;

        return $this;
    }

    public function getEquipementFluide(): ?EquipementFluide
    {
        return $this->equipement_fluide;
    }

    public function setEquipementFluide(?EquipementFluide $equipement_fluide): self
    {
        $this->equipement_fluide = $equipement_fluide;

        return $this;
    }

    public function getChargeTotale(): ?float
    {
        return $this->charge_totale;
    }
    public function setChargeTotale(?float $charge_totale): self{
        $this->charge_totale = $charge_totale;
        return $this;
    }

    public function getTonnageEqCo2(): ?float
    {
        return $this->tonnage_eq_co2;
    }
    public function setTonnageEqCo2(?float $tonnage_eq_co2): self{
        $this->tonnage_eq_co2 = $tonnage_eq_co2;
        return $this;
    }

    public function getBallonDeporte(): ?bool
    {
        return $this->ballon_deporte;
    }

    public function setBallonDeporte(?bool $ballon_deporte): self
    {
        $this->ballon_deporte = $ballon_deporte;

        return $this;
    }

    public function getBallonCapacite(): ?int
    {
        return $this->ballon_capacite;
    }

    public function setBallonCapacite(?int $ballon_capacite): self
    {
        $this->ballon_capacite = $ballon_capacite;

        return $this;
    }

    public function getEquipementReleve(): ?EquipementReleve
    {
        return $this->equipement_releve;
    }

    public function setEquipementReleve(?EquipementReleve $equipement_releve): self
    {
        $this->equipement_releve = $equipement_releve;

        return $this;
    }

    public function getEquipementAncien(): ?Equipement
    {
        return $this->equipement_ancien;
    }

    public function setEquipementAncien(?Equipement $equipement_ancien): self
    {
        $this->equipement_ancien = $equipement_ancien;

        return $this;
    }

    public function getContactFinGarantie(): ?bool
    {
        return $this->contact_fin_garantie;
    }

    public function setContactFinGarantie(?bool $contact_fin_garantie): self
    {
        $this->contact_fin_garantie = $contact_fin_garantie;

        return $this;
    }

    /**
     * @return Collection<int, OldBlocNoteClient>
     */
    public function getOldBlocNoteClients(): Collection
    {
        return $this->oldBlocNoteClients;
    }

    public function addOldBlocNoteClient(OldBlocNoteClient $oldBlocNoteClient): self
    {
        if (!$this->oldBlocNoteClients->contains($oldBlocNoteClient)) {
            $this->oldBlocNoteClients[] = $oldBlocNoteClient;
            $oldBlocNoteClient->setEquipement($this);
        }

        return $this;
    }

    public function removeOldBlocNoteClient(OldBlocNoteClient $oldBlocNoteClient): self
    {
        if ($this->oldBlocNoteClients->removeElement($oldBlocNoteClient)) {
            // set the owning side to null (unless already changed)
            if ($oldBlocNoteClient->getEquipement() === $this) {
                $oldBlocNoteClient->setEquipement(null);
            }
        }

        return $this;
    }

    public function getHistoriqueEquipementOptions() {
        $result = [];
        if ($this->equipementOptions) {
            foreach ($this->equipementOptions as $equipementOption) {
                if ($equipementOption->getDateFin() && $equipementOption->getDateFin() < new DateTime()) {
                    $result[] = $equipementOption;
                }
            }
            return $result;
        }
        return null;
    }

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

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

    /**
     * @return Collection<int, PlanningHistoriqueModification>
     */
    public function getPlanningHistoriqueModifications(): Collection
    {
        return $this->planningHistoriqueModifications;
    }

    public function addPlanningHistoriqueModification(PlanningHistoriqueModification $planningHistoriqueModification): self
    {
        if (!$this->planningHistoriqueModifications->contains($planningHistoriqueModification)) {
            $this->planningHistoriqueModifications[] = $planningHistoriqueModification;
            $planningHistoriqueModification->setEquipement($this);
        }

        return $this;
    }

    public function removePlanningHistoriqueModification(PlanningHistoriqueModification $planningHistoriqueModification): self
    {
        if ($this->planningHistoriqueModifications->removeElement($planningHistoriqueModification)) {
            // set the owning side to null (unless already changed)
            if ($planningHistoriqueModification->getEquipement() === $this) {
                $planningHistoriqueModification->setEquipement(null);
            }
        }

        return $this;
    }

}
