<?php

namespace Lc\ShopBundle\Model;

use App\Entity\TicketMessage;
use App\Entity\User;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping as ORM;
use Lc\ShopBundle\Context\FilterMerchantInterface;
use Lc\ShopBundle\Context\MerchantInterface;
use Lc\ShopBundle\Context\OrderShopInterface;
use Gedmo\Mapping\Annotation as Gedmo;
use Lc\ShopBundle\Context\UserInterface;

/**
 * @ORM\MappedSuperclass()
 */
abstract class Ticket extends AbstractEntity implements FilterMerchantInterface
{
        const TYPE_PRODUCT_UNAVAILABLE = 'product-unavailable' ;
        const TYPE_PRODUCT_ERROR = 'product-error' ;
        const TYPE_TECHNICAL_PROBLEM = 'technical-problem' ;
        const TYPE_GENERAL_QUESTION = 'general-question' ;

        const TICKET_STATUS_OPEN = 'open' ;
        const TICKET_STATUS_BEING_PROCESSED = 'being-processed' ;
        const TICKET_STATUS_CLOSED = 'closed' ;

        /**
         * @Gedmo\Blameable(on="create")
         * @ORM\ManyToOne(targetEntity="Lc\ShopBundle\Context\UserInterface")
         * @ORM\JoinColumn(nullable=true)
         */
        protected $createdBy;

        /**
         * @Gedmo\Blameable(on="update")
         * @ORM\ManyToOne(targetEntity="Lc\ShopBundle\Context\UserInterface")
         * @ORM\JoinColumn(nullable=true)
         */
        protected $updatedBy;

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

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

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

        /**
         * @ORM\ManyToOne(targetEntity="Lc\ShopBundle\Context\OrderShopInterface", inversedBy="tickets")
         */
        protected $orderShop;

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

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

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

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

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

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

        /**
         * @ORM\OneToMany(targetEntity="Lc\ShopBundle\Context\TicketMessageInterface", mappedBy="ticket", orphanRemoval=true)
         * @ORM\OrderBy({"id" = "ASC"})
         */
        protected $ticketMessages;

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

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

        public function getUsername(){
                if($this->getUser()){
                        return $this->getUser()->getName();
                }else{
                        return strtoupper($this->getVisitorLastname()).' '.$this->getVisitorFirstname();
                }
        }

        public function getVisitorInfos(){

                return strtoupper($this->getVisitorLastname()).' '.$this->getVisitorFirstname(). ' ('.$this->getVisitorEmail().')';

        }

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

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

                return $this;
        }

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

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

                return $this;
        }

        public function getTypeLabel(): string
        {
                return 'field.Ticket.typeOptions.'.$this->getType() ;
        }

        public function getStatus(): ?string
        {
                return $this->status;
        }

        public function setStatus(string $status): self
        {
                $this->status = $status;

                return $this;
        }

        public function getStatusLabel(): string
        {
                return 'field.Ticket.statusOptions.'.$this->getStatus() ;
        }

        public function getOrderShop(): ?OrderShopInterface
        {
                return $this->orderShop;
        }

        public function setOrderShop(?OrderShopInterface $orderShop): self
        {
                $this->orderShop = $orderShop;

                return $this;
        }

        public function getSubject(): ?string
        {
                return $this->subject;
        }

        public function setSubject(string $subject): self
        {
                $this->subject = $subject;

                return $this;
        }

        public function getTags(): ?array
        {
                return $this->tags;
        }

        public function setTags(?array $tags): self
        {
                $this->tags = $tags;

                return $this;
        }

        public function getVisitorFirstname(): ?string
        {
                return $this->visitorFirstname;
        }

        public function setVisitorFirstname(?string $visitorFirstname): self
        {
                $this->visitorFirstname = $visitorFirstname;

                return $this;
        }

        public function getVisitorLastname(): ?string
        {
                return $this->visitorLastname;
        }

        public function setVisitorLastname(?string $visitorLastname): self
        {
                $this->visitorLastname = $visitorLastname;

                return $this;
        }

        public function getVisitorEmail(): ?string
        {
                return $this->visitorEmail;
        }

        public function setVisitorEmail(?string $visitorEmail): self
        {
                $this->visitorEmail = $visitorEmail;

                return $this;
        }

        public function getVisitorToken(): ?string
        {
                return $this->visitorToken;
        }

        public function setVisitorToken(?string $visitorToken): self
        {
                $this->visitorToken = $visitorToken;

                return $this;
        }

        /**
         * @return Collection|TicketMessage[]
         */
        public function getTicketMessages(): Collection
        {
                return $this->ticketMessages;
        }

        public function addTicketMessage(TicketMessage $ticketMessage): self
        {
                if (!$this->ticketMessages->contains($ticketMessage)) {
                        $this->ticketMessages[] = $ticketMessage;
                        $ticketMessage->setTicket($this);
                }

                return $this;
        }

        public function removeTicketMessage(TicketMessage $ticketMessage): self
        {
                if ($this->ticketMessages->contains($ticketMessage)) {
                        $this->ticketMessages->removeElement($ticketMessage);
                        // set the owning side to null (unless already changed)
                        if ($ticketMessage->getTicket() === $this) {
                                $ticketMessage->setTicket(null);
                        }
                }

                return $this;
        }

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

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

                return $this;
        }
}
