<?php

namespace Lc\ShopBundle\Model;

use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\MappedSuperclass()
 */
abstract class Address extends AbstractEntity
{

        const TYPE_INDIVIDUAL = 'individual';
        const TYPE_LEGAL_PERSON = 'legal-person';

        /**
         * @ORM\ManyToOne(targetEntity="Lc\ShopBundle\Context\UserInterface", inversedBy="addresses")
         * @ORM\JoinColumn(nullable=true)
         */
        protected $user;

        /**
         * @ORM\Column(type="string", length=255)
         */
        protected $title;

        /**
         * @ORM\Column(type="string", length=31)
         */
        protected $type;

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

        /**
         * @ORM\Column(type="string", length=127, nullable=true)
         */
        protected $lastname;

        /**
         * @ORM\Column(type="string", length=127, nullable=true)
         */
        protected $firstname;

        /**
         * @ORM\Column(type="text")
         */
        protected $address;

        /**
         * @ORM\Column(type="string", length=31)
         */
        protected $zip;

        /**
         * @ORM\Column(type="string", length=255)
         */
        protected $city;

        /**
         * @ORM\Column(type="string", length=255)
         */
        protected $country;

        /**
         * @ORM\Column(type="string", length=255, nullable=true)
         */
        protected $company;

        /**
         * @ORM\Column(type="string", length=127, nullable=true)
         */
        protected $siret;

        /**
         * @ORM\Column(type="string", length=127, nullable=true)
         */
        protected $tva;

        /**
         * @ORM\Column(type="array", nullable=true)
         */
        protected $phone;

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

        /**
         * @ORM\OneToOne(targetEntity="Lc\ShopBundle\Context\PointSaleInterface", mappedBy="address", cascade={"persist", "remove"})
         */
        protected $pointSale;

        /**
         * @ORM\OneToOne(targetEntity="Lc\ShopBundle\Context\MerchantInterface", mappedBy="address", cascade={"persist", "remove"})
         */
        protected $merchant;

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

        public function __construct()
        {
                $this->phone = [] ;
        }

        public function __toString()
        {
                return $this->getTitle() . ' - ' . $this->getZip() . ' ' . $this->getCity();
        }

        public function getSummaryShort()
        {
                return $this->getAddress() . ' - ' . $this->getZip() . ' ' . $this->getCity();
        }

        public function getSummary($withTitle = true)
        {
                $html = '';

                if ($this->getTitle() && $withTitle) {
                        $html .= $this->getTitle() . '<br />';
                }

                if ($this->getLastname() || $this->getFirstname()) {
                        $html .= $this->getLastname() . ' ' . $this->getFirstname() . '<br />';
                }

                if ($this->getAddress()) {
                        $html .= $this->getAddress() . '<br />';
                }

                if ($this->getZip() || $this->getCity()) {
                        $html .= $this->getZip() . ' ' . $this->getCity() . '<br />';
                }

                if ($this->getPhone()) {
                        foreach($this->getPhone() as $phone) {
                                $html .= 'Tél. ' . $phone.'<br />';
                        }
                }

                return $html;
        }

        public function getUser(): ?User
        {
                return $this->user;
        }

        public function setUser(?User $user): self
        {
                $this->user = $user;

                return $this;
        }

        public function getTitle(): ?string
        {
                return $this->title;
        }

        public function setTitle(string $title): self
        {
                $this->title = $title;

                return $this;
        }

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

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

                return $this;
        }

        public function getCivility(): ?bool
        {
                return $this->civility;
        }

        public function setCivility(?bool $civility): self
        {
                $this->civility = $civility;

                return $this;
        }

        public function getLastname(): ?string
        {
                return $this->lastname;
        }

        public function setLastname(?string $lastname): self
        {
                $this->lastname = $lastname;

                return $this;
        }

        public function getFirstname(): ?string
        {
                return $this->firstname;
        }

        public function setFirstname(?string $firstname): self
        {
                $this->firstname = $firstname;

                return $this;
        }

        public function getAddress(): ?string
        {
                return $this->address;
        }

        public function setAddress(string $address): self
        {
                $this->address = $address;

                return $this;
        }

        public function getZip(): ?string
        {
                return $this->zip;
        }

        public function setZip(string $zip): self
        {
                $this->zip = $zip;

                return $this;
        }

        public function getCity(): ?string
        {
                return $this->city;
        }

        public function setCity(string $city): self
        {
                $this->city = $city;

                return $this;
        }

        public function getCountry(): ?string
        {
                return $this->country;
        }

        public function setCountry(string $country): self
        {
                $this->country = $country;

                return $this;
        }

        public function getCompany(): ?string
        {
                return $this->company;
        }

        public function setCompany(?string $company): self
        {
                $this->company = $company;

                return $this;
        }

        public function getSiret(): ?string
        {
                return $this->siret;
        }

        public function setSiret(?string $siret): self
        {
                $this->siret = $siret;

                return $this;
        }

        public function getTva(): ?string
        {
                return $this->tva;
        }

        public function setTva(?string $tva): self
        {
                $this->tva = $tva;

                return $this;
        }

        public function getPhone(): ?array
        {
                return $this->phone;
        }

        public function setPhone(?array $phone): self
        {
                $this->phone = $phone;

                return $this;
        }

        public function getComment(): ?string
        {
                return $this->comment;
        }

        public function setComment(?string $comment): self
        {
                $this->comment = $comment;

                return $this;
        }


        public function getPointSale(): ?PointSale
        {
                return $this->pointSale;
        }

        public function setPointSale(PointSale $pointSale): self
        {
                $this->pointSale = $pointSale;

                // set the owning side of the relation if necessary
                if ($pointSale->getAddress() !== $this) {
                        $pointSale->setAddress($this);
                }

                return $this;
        }

        public function getMerchant(): ?Merchant
        {
                return $this->merchant;
        }

        public function setMerchant(Merchant $merchant): self
        {
                $this->merchant = $merchant;

                // set the owning side of the relation if necessary
                if ($merchant->getAddress() !== $this) {
                        $merchant->setAddress($this);
                }

                return $this;
        }

        public function getDeliveryInfos(): ?string
        {
                return $this->deliveryInfos;
        }

        public function setDeliveryInfos(?string $deliveryInfos): self
        {
                $this->deliveryInfos = $deliveryInfos;

                return $this;
        }
}
