<?php

namespace Lc\ShopBundle\Model;

use App\Entity\CreditHistory;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping as ORM;
use Lc\ShopBundle\Context\CreditHistoryInterface;
use Lc\ShopBundle\Context\FilterMerchantInterface;

/**
 * @ORM\MappedSuperclass()
 *
 */
abstract class UserMerchant implements FilterMerchantInterface
{
        /**
         * @ORM\ManyToOne(targetEntity="Lc\ShopBundle\Context\UserInterface", inversedBy="userMerchants")
         * @ORM\JoinColumn(nullable=false)
         */
        protected $user;

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

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

        /**
         * @ORM\Column(type="boolean")
         */
        protected $creditActive;

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

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

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

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

                return $this;
        }

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

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

                return $this;
        }

        public function getCredit(): ?float
        {
                return $this->credit;
        }

        public function setCredit(?float $credit): self
        {
                $this->credit = $credit;

                return $this;
        }

        public function getCreditActive(): ?bool
        {
                return $this->creditActive;
        }

        public function isCreditActive(): bool
        {
                return $this->creditActive;
        }

        public function setCreditActive(bool $creditActive): self
        {
                $this->creditActive = $creditActive;

                return $this;
        }

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

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

                return $this;
        }

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

                return $this;
        }
}