<?php

namespace App\Entity;

use App\Repository\AdresseRepository;
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;

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

    /**
     * @ORM\ManyToOne(targetEntity=TypeAdresse::class, inversedBy="adresses")
     * @ORM\JoinColumn(nullable=false, name="idtype_adresse")
     */
    private $type_adresse;

    /**
     * @ORM\ManyToOne(targetEntity=TypeLogement::class, inversedBy="adresses")
     * @ORM\JoinColumn(nullable=false, name="idtype_logement")
     * @Groups({"api", "planning"})
     */
    private $type_logement;

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

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

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

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

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

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

    /**
     * @ORM\OneToMany(targetEntity=UtilisateurAdresse::class, mappedBy="adresse", orphanRemoval=true)
     * @Ignore()
     */
    private $utilisateurAdresses;

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

    /**
     * @ORM\OneToMany(targetEntity=Equipement::class, mappedBy="adresse", cascade={"persist"})
     * @Ignore()
     */
    private $equipements;

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

    /**
     * @ORM\OneToMany(targetEntity=AdresseComplement::class, mappedBy="adresse")
     * @Groups({"api"})
     */
    private $adresseComplements;

    public function __construct()
    {
        $this->utilisateurAdresses = new ArrayCollection();
        $this->clientAdresses = new ArrayCollection();
        $this->equipements = new ArrayCollection();
        $this->factures = new ArrayCollection();
        $this->adresseComplements = new ArrayCollection();
    }

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

    public function getTypeAdresse(): ?TypeAdresse
    {
        return $this->type_adresse;
    }

    public function setTypeAdresse(?TypeAdresse $type_adresse): self
    {
        $this->type_adresse = $type_adresse;

        return $this;
    }

    public function getTypeLogement(): ?TypeLogement
    {
        return $this->type_logement;
    }

    public function setTypeLogement(?TypeLogement $type_logement): self
    {
        $this->type_logement = $type_logement;

        return $this;
    }

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

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

        return $this;
    }

    public function getAdresseComplement(): ?string
    {
        return $this->adresse_complement;
    }

    public function setAdresseComplement(?string $adresse_complement): self
    {
        $this->adresse_complement = $adresse_complement;

        return $this;
    }

    public function getCodePostal(): ?string
    {
        return $this->code_postal;
    }

    public function setCodePostal(?string $code_postal): self
    {
        $this->code_postal = $code_postal;

        return $this;
    }

    public function getVille(): ?string
    {
        return $this->ville;
    }

    public function setVille(?string $ville): self
    {
        $this->ville = $ville;

        return $this;
    }

    public function getLatitude(): ?float
    {
        return $this->latitude;
    }

    public function setLatitude(?float $latitude): self
    {
        $this->latitude = $latitude;

        return $this;
    }

    public function getLongitude(): ?float
    {
        return $this->longitude;
    }

    public function setLongitude(?float $longitude): self
    {
        $this->longitude = $longitude;

        return $this;
    }

    /**
     * @return Collection|UtilisateurAdresse[]
     */
    public function getUtilisateurAdresses(): Collection
    {
        return $this->utilisateurAdresses;
    }

    public function addUtilisateurAdress(UtilisateurAdresse $utilisateurAdress): self
    {
        if (!$this->utilisateurAdresses->contains($utilisateurAdress)) {
            $this->utilisateurAdresses[] = $utilisateurAdress;
            $utilisateurAdress->setAdresse($this);
        }

        return $this;
    }

    public function removeUtilisateurAdress(UtilisateurAdresse $utilisateurAdress): self
    {
        if ($this->utilisateurAdresses->removeElement($utilisateurAdress)) {
            // set the owning side to null (unless already changed)
            if ($utilisateurAdress->getAdresse() === $this) {
                $utilisateurAdress->setAdresse(null);
            }
        }

        return $this;
    }

    public function getCoordonnees(): array
    {
        return [$this->getLongitude(),  $this->getLatitude()];
    }

    public function getLisibleAdresse() {
        return $this->getAdresse() . ' ' . $this->getAdresseComplement() . ' ' . $this->getCodePostal() . ' ' . $this->getVille();
    }

    public function getComplementsImportants() {
        $complements = '';
        if ($this->getAdresseComplements()) {
            foreach ($this->getAdresseComplements() as $adresseComplement) {
                $typeComplement = $adresseComplement->getTypeComplementAdresse();
                if ($typeComplement && in_array($typeComplement->getId(), [TypeComplementAdresse::ID_BATIMENT, TypeComplementAdresse::ID_ETAGE, TypeComplementAdresse::ID_PORTE])) {
                    $complements .= ' - ' . $typeComplement->getLibelle() . ' ' . $adresseComplement->getValeur();
                }
            }
        }
        return $complements;
    }

    public function getEtagePorteComplement() {
        $complements =[];
        if ($this->getAdresseComplements()) {
            foreach ($this->getAdresseComplements() as $adresseComplement) {
                $typeComplement = $adresseComplement->getTypeComplementAdresse();
                if ($typeComplement && $typeComplement->getId() == TypeComplementAdresse::ID_ETAGE) {
                    $complements[] = $typeComplement->getLibelle() . ' ' . $adresseComplement->getValeur();
                }
                if ($typeComplement && $typeComplement->getId() == TypeComplementAdresse::ID_PORTE) {
                    $complements[] = $typeComplement->getLibelle() . ' ' . $adresseComplement->getValeur();
                }
            }
        }
        return implode(', ', $complements);
    }

    /**
     * @return Collection<int, ClientAdresse>
     */
    public function getClientAdresses(): Collection
    {
        return $this->clientAdresses;
    }

    public function addClientAdress(ClientAdresse $clientAdress): self
    {
        if (!$this->clientAdresses->contains($clientAdress)) {
            $this->clientAdresses[] = $clientAdress;
            $clientAdress->setAdresse($this);
        }

        return $this;
    }

    public function removeClientAdress(ClientAdresse $clientAdress): self
    {
        if ($this->clientAdresses->removeElement($clientAdress)) {
            // set the owning side to null (unless already changed)
            if ($clientAdress->getAdresse() === $this) {
                $clientAdress->setAdresse(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->setAdresse($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->getAdresse() === $this) {
                $equipement->setAdresse(null);
            }
        }

        return $this;
    }

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

        return $this;
    }

    /**
     * @return Collection<int, AdresseComplement>
     */
    public function getAdresseComplements(): Collection
    {
        return $this->adresseComplements;
    }

    public function addAdresseComplement(AdresseComplement $adresseComplement): self
    {
        if (!$this->adresseComplements->contains($adresseComplement)) {
            $this->adresseComplements[] = $adresseComplement;
            $adresseComplement->setAdresse($this);
        }

        return $this;
    }

    public function removeAdresseComplement(AdresseComplement $adresseComplement): self
    {
        if ($this->adresseComplements->removeElement($adresseComplement)) {
            // set the owning side to null (unless already changed)
            if ($adresseComplement->getAdresse() === $this) {
                $adresseComplement->setAdresse(null);
            }
        }

        return $this;
    }
}
