<?php

namespace Lc\ShopBundle\Model;

use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping as ORM;
use FOS\UserBundle\Model\User as UserModelFOS;
use Lc\ShopBundle\Context\MerchantInterface;

/**
 * @ORM\MappedSuperclass()
 */
abstract class User extends UserModelFOS
{
        /**
         * @ORM\Column(type="string", length=20, nullable=true)
         */
        protected $phone;

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

        /**
         * @ORM\ManyToOne(targetEntity="Lc\ShopBundle\Context\MerchantInterface")
         */
        protected $merchant;

        /**
         * @ORM\OneToMany(targetEntity="Lc\ShopBundle\Context\CreditHistoryInterface", mappedBy="user", orphanRemoval=true)
         */
        private $creditHistories;

        /**
         * @ORM\OneToMany(targetEntity="Lc\ShopBundle\Context\AddressInterface", mappedBy="user")
         */
        private $addresses;

        /**
         * @ORM\OneToMany(targetEntity="Lc\ShopBundle\Context\OrderShopInterface", mappedBy="user")
         */
        private $orders;

        public function __construct()
        {
                $this->creditHistories = new ArrayCollection();
                $this->addresses = new ArrayCollection();
                $this->orders = new ArrayCollection();
        }

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

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

                return $this;
        }

        public function getBehaviorDisplayPrice(): ?string
        {
                return $this->behaviorDisplayPrice;
        }

        public function setBehaviorDisplayPrice(?string $behaviorDisplayPrice): self
        {
                $this->behaviorDisplayPrice = $behaviorDisplayPrice;

                return $this;
        }

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

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

                return $this;
        }

        /**
         * @return Collection|CreditHistory[]
         */
        public function getCreditHistories(): Collection
        {
                return $this->creditHistories;
        }

        public function addCreditHistory(CreditHistory $creditHistory): self
        {
                if (!$this->creditHistories->contains($creditHistory)) {
                        $this->creditHistories[] = $creditHistory;
                        $creditHistory->setUser($this);
                }

                return $this;
        }

        public function removeCreditHistory(CreditHistory $creditHistory): self
        {
                if ($this->creditHistories->contains($creditHistory)) {
                        $this->creditHistories->removeElement($creditHistory);
                        // set the owning side to null (unless already changed)
                        if ($creditHistory->getUser() === $this) {
                                $creditHistory->setUser(null);
                        }
                }

                return $this;
        }

        /**
         * @return Collection|Address[]
         */
        public function getAddresses(): Collection
        {
                return $this->addresses;
        }

        public function addAddress(Address $address): self
        {
                if (!$this->addresses->contains($address)) {
                        $this->addresses[] = $address;
                        $address->setUser($this);
                }

                return $this;
        }

        public function removeAddress(Address $address): self
        {
                if ($this->addresses->contains($address)) {
                        $this->addresses->removeElement($address);
                        // set the owning side to null (unless already changed)
                        if ($address->getUser() === $this) {
                                $address->setUser(null);
                        }
                }

                return $this;
        }

        /**
         * @return Collection|ShopOrder[]
         */
        public function getOrders(): Collection
        {
                return $this->orders;
        }

        public function addOrder(OrderShop $order): self
        {
                if (!$this->orders->contains($order)) {
                        $this->orders[] = $order;
                        $order->setUser($this);
                }

                return $this;
        }

        public function removeOrder(OrderShop $order): self
        {
                if ($this->orders->contains($order)) {
                        $this->orders->removeElement($order);
                        // set the owning side to null (unless already changed)
                        if ($order->getUser() === $this) {
                                $order->setUser(null);
                        }
                }

                return $this;
        }
}