<?php

namespace App\Entity;

use App\Entity\Link\Check;
use App\Entity\Traits\TimestampableTrait;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;
use Symfony\Component\Validator\Constraints as Assert;

/**
 * @ORM\Entity()
 * @UniqueEntity("negotiation")
 * @ORM\EntityListeners({"App\EntityListener\LinkListener"})
 */
class Link
{
    use TimestampableTrait;

    /**
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     */
    private $id;

    /**
     * @ORM\Column(type="string", length=255)
     * @Assert\NotBlank()
     */
    private $url;

    /**
     * @ORM\Column(type="EnumLinkStatusType", nullable=true)
     */
    private $status;

    /**
     * @ORM\ManyToOne(targetEntity="App\Entity\Prospect", inversedBy="links")
     * @ORM\JoinColumn(nullable=false)
     * @Assert\NotBlank()
     */
    private $prospect;

    /**
     * @ORM\ManyToOne(targetEntity="App\Entity\Content", inversedBy="links")
     * @ORM\JoinColumn(nullable=false, onDelete="CASCADE")
     * @Assert\NotBlank()
     */
    private $content;

    /**
     * @ORM\Column(type="datetime", nullable=true)
     */
    private $checkedAt;

    /**
     * @ORM\OneToOne(targetEntity="App\Entity\Negotiation")
     * @ORM\JoinColumn(nullable=false, onDelete="CASCADE")
     * @Assert\NotBlank()
     */
    private $negotiation;

    /**
     * @ORM\Column(type="string", length=50, nullable=true)
     */
    private $ipFrom;

    /**
     * @ORM\Column(type="string", length=50, nullable=true)
     */
    private $ipTo;

    /**
     * @ORM\OneToMany(targetEntity="App\Entity\Link\Check", mappedBy="link")
     * @ORM\OrderBy({"createdAt" = "DESC"})
     */
    private $checks;

    /**
     * @ORM\OneToOne(targetEntity="App\Entity\Link\Check", orphanRemoval=true)
     * @ORM\JoinColumn(nullable=true, onDelete="SET NULL")
     */
    private $failCheck;

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

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

    public function getUrl(): ?string
    {
        return $this->url;
    }

    public function setUrl(string $url): self
    {
        $this->url = $url;

        return $this;
    }

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

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

        return $this;
    }

    public function getProspect(): ?Prospect
    {
        return $this->prospect;
    }

    public function setProspect(?Prospect $prospect): self
    {
        $this->prospect = $prospect;

        return $this;
    }

    public function getContent(): ?Content
    {
        return $this->content;
    }

    public function setContent(?Content $content): self
    {
        $this->content = $content;

        return $this;
    }

    public function getCheckedAt(): ?\DateTimeInterface
    {
        return $this->checkedAt;
    }

    public function setCheckedAt(?\DateTimeInterface $checkedAt): self
    {
        $this->checkedAt = $checkedAt;

        return $this;
    }

    public function getNegotiation(): ?Negotiation
    {
        return $this->negotiation;
    }

    public function setNegotiation(Negotiation $negotiation): self
    {
        $this->negotiation = $negotiation;

        return $this;
    }

    public function getIpFrom(): ?string
    {
        return $this->ipFrom;
    }

    public function setIpFrom(?string $ipFrom): self
    {
        $this->ipFrom = $ipFrom;

        return $this;
    }

    public function getIpTo(): ?string
    {
        return $this->ipTo;
    }

    public function setIpTo(?string $ipTo): self
    {
        $this->ipTo = $ipTo;

        return $this;
    }

    /**
     * @return Check[]
     */
    public function getChecks(): array
    {
        return $this->checks->slice(0, 10);
    }

    public function addCheck(Check $check): self
    {
        if (!$this->checks->contains($check)) {
            $this->checks[] = $check;
            $check->setLink($this);
        }

        return $this;
    }

    public function removeCheck(Check $check): self
    {
        if ($this->checks->contains($check)) {
            $this->checks->removeElement($check);
            // set the owning side to null (unless already changed)
            if ($check->getLink() === $this) {
                $check->setLink(null);
            }
        }

        return $this;
    }

    public function getFailCheck(): ?Check
    {
        return $this->failCheck;
    }

    public function setFailCheck(?Check $failCheck): self
    {
        $this->failCheck = $failCheck;

        return $this;
    }
}
