<?php
namespace Whater\Domain\Product\Model;
use BornFree\TacticianDomainEvent\Recorder\ContainsRecordedEvents;
use BornFree\TacticianDomainEvent\Recorder\EventRecorderCapabilities;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Ramsey\Uuid\Uuid;
use Whater\Domain\Common\Exception\InvalidUUIDException;
use Whater\Domain\Product\Model\Product;
use Whater\Domain\User\Model\User;
/**
* Class ProductValoration
*
* @package Whater\Domain\Whater\Model
*/
class ProductValoration implements ContainsRecordedEvents
{
use EventRecorderCapabilities;
public const WP_MAX_VALORATION = 5;
public const WP_MIN_VALORATION = 0;
/**
* @var string
*/
private $uuid;
/**
* @var Product
*/
private $product;
/**
* @var CartOrderItem
*/
private $cartOrderItem;
/**
* @var User
*/
private $createdBy;
/**
* @var \DateTime
*/
private $createdAt;
/**
* @var string
*/
private $rating;
public function __construct(
string $productValorationId = null,
CartOrderItem $cartOrderItem,
User $createdBy,
string $rating
) {
try {
$this->uuid = Uuid::fromString($productValorationId ?: Uuid::uuid4())->toString();
} catch (\InvalidArgumentException $e) {
throw new InvalidUUIDException();
}
$this->cartOrderItem = $cartOrderItem;
$this->product = $cartOrderItem->product();
$this->createdBy = $createdBy;
$this->createdAt = new \DateTime();
$this->updateValoration(
$rating
);
}
public function updateValoration(
string $rating = null
): ProductValoration {
if (!$this->product()->valorations()->contains($this)) {
$this->product()->valorations()->add($this);
}
if (!is_null($rating)) {
$this->rating = $rating;
}
return $this;
}
/**
* @return string
*/
public function id(): string
{
return $this->uuid;
}
/**
* @return ProducCartOrderItemt
*/
public function cartOrderItem(): CartOrderItem
{
return $this->cartOrderItem;
}
/**
* @return Product
*/
public function product(): Product
{
return $this->product;
}
/**
* @return User
*/
public function createdBy(): User
{
return $this->createdBy;
}
/**
* @return string
*/
public function rating(): ?string
{
return $this->rating;
}
/**
* @return \DateTime
*/
public function createdAt(): \DateTime
{
return $this->createdAt;
}
/**
* @return bool
*/
public function equals(ProductValoration $productValoration)
{
return $this->id() === $productValoration->id();
}
}