<?php
/**
 * @author  Magediary
 * @package Magediary_ProductQuestion
 */

namespace Magediary\ProductQuestion\Model\Data;

use Magediary\ProductQuestion\Api\Data\AnswerExtensionInterface;
use Magediary\ProductQuestion\Api\Data\AnswerInterface;
use Magediary\ProductQuestion\Model\QuestionFactory;
use Magento\Catalog\Api\ProductRepositoryInterface;
use Magento\Framework\Api\AbstractExtensibleObject;

class Answer extends AbstractExtensibleObject implements AnswerInterface
{
    /**
     * @var ProductRepositoryInterface
     */
    protected $productRepository;

    /**
     * @var \Magediary\ProductQuestion\Model\Answer
     */
    protected $answerResource;

    /**
     * @var \Magediary\ProductQuestion\Model\Question
     */
    protected $questionFactory;

    /**
     * @param \Magento\Framework\Api\ExtensionAttributesFactory $extensionFactory
     * @param \Magento\Framework\Api\AttributeValueFactory $attributeValueFactory
     * @param \Magediary\ProductQuestion\Model\ResourceModel\Answer $answerResource
     * @param QuestionFactory $questionFactory
     * @param ProductRepositoryInterface $productRepository
     */
    public function __construct(
        \Magento\Framework\Api\ExtensionAttributesFactory $extensionFactory,
        \Magento\Framework\Api\AttributeValueFactory $attributeValueFactory,
        \Magediary\ProductQuestion\Model\ResourceModel\Answer $answerResource,
        QuestionFactory $questionFactory,
        ProductRepositoryInterface $productRepository
    ) {
        $this->productRepository = $productRepository;
        $this->answerResource = $answerResource;
        $this->questionFactory = $questionFactory;

        parent::__construct($extensionFactory, $attributeValueFactory);
    }

    /**
     * Get answer_id
     *
     * @return int|null
     */
    public function getId()
    {
        return $this->_get(self::ANSWER_ID);
    }

    /**
     * @inheritDoc
     */
    public function getAnswerId()
    {
        return $this->_get(self::ANSWER_ID);
    }

    /**
     * @inheritDoc
     */
    public function setAnswerId($answerId)
    {
        return $this->setData(self::ANSWER_ID, $answerId);
    }

    /**
     * Get question model
     *
     * @return \Magediary\ProductQuestion\Model\Question
     */
    public function getQuestion()
    {
        return $this->questionFactory->create()->load($this->getQuestionId());
    }

    /**
     * @inheritDoc
     */
    public function getQuestionId()
    {
        return $this->_get(self::QUESTION_ID);
    }

    /**
     * @inheritDoc
     */
    public function setQuestionId($questionId)
    {
        return $this->setData(self::QUESTION_ID, $questionId);
    }

    /**
     * @inheritDoc
     */
    public function getCustomerId()
    {
        return $this->_get(self::CUSTOMER_ID);
    }

    /**
     * @inheritDoc
     */
    public function setCustomerId($customerId)
    {
        return $this->setData(self::CUSTOMER_ID, $customerId);
    }

    /**
     * @inheritDoc
     */
    public function getType()
    {
        return $this->_get(self::TYPE);
    }

    /**
     * @inheritDoc
     */
    public function setType($type)
    {
        return $this->setData(self::TYPE, $type);
    }

    /**
     * @inheritDoc
     */
    public function getNickname()
    {
        return $this->_get(self::NICKNAME);
    }

    /**
     * @inheritDoc
     */
    public function setNickname($nickname)
    {
        return $this->setData(self::NICKNAME, $nickname);
    }

    /**
     * @inheritDoc
     */
    public function getEmail()
    {
        return $this->_get(self::EMAIL);
    }

    /**
     * @inheritDoc
     */
    public function setEmail($email)
    {
        return $this->setData(self::EMAIL, $email);
    }

    /**
     * @inheritDoc
     */
    public function getStatus()
    {
        return $this->_get(self::STATUS);
    }

    /**
     * @inheritDoc
     */
    public function setStatus($status)
    {
        return $this->setData(self::STATUS, $status);
    }

    /**
     * @inheritDoc
     */
    public function getDetail()
    {
        return $this->_get(self::DETAIL);
    }

    /**
     * @inheritDoc
     */
    public function setDetail($detail)
    {
        return $this->setData(self::DETAIL, $detail);
    }

    /**
     * @inheritDoc
     */
    public function getIsCertified()
    {
        return $this->_get(self::IS_CERTIFIED);
    }

    /**
     * @inheritDoc
     */
    public function setIsCertified($isCertified)
    {
        return $this->setData(self::IS_CERTIFIED, $isCertified);
    }

    /**
     * @inheritDoc
     */
    public function getIsAnonymous()
    {
        return $this->_get(self::IS_ANONYMOUS);
    }

    /**
     * @inheritDoc
     */
    public function setIsAnonymous($isAnonymous)
    {
        return $this->setData(self::IS_ANONYMOUS, $isAnonymous);
    }

    /**
     * @inheritDoc
     */
    public function getLikes()
    {
        return $this->_get(self::LIKES) ?? 0;
    }

    /**
     * @inheritDoc
     */
    public function setLikes($likes)
    {
        return $this->setData(self::LIKES, $likes);
    }

    /**
     * @inheritDoc
     */
    public function getDislikes()
    {
        return $this->_get(self::DISLIKES) ?? 0;
    }

    /**
     * @inheritDoc
     */
    public function setDislikes($dislikes)
    {
        return $this->setData(self::DISLIKES, $dislikes);
    }

    /**
     * @inheritDoc
     */
    public function getAbuses()
    {
        return $this->_get(self::ABUSES);
    }

    /**
     * @inheritDoc
     */
    public function setAbuses($abuses)
    {
        return $this->setData(self::ABUSES, $abuses);
    }

    /**
     * @inheritDoc
     */
    public function getCreatedAt()
    {
        return $this->_get(self::CREATED_AT);
    }

    /**
     * @inheritDoc
     */
    public function setCreatedAt($createdAt)
    {
        return $this->setData(self::CREATED_AT, $createdAt);
    }

    /**
     * @inheritDoc
     */
    public function getUpdatedAt()
    {
        return $this->_get(self::UPDATED_AT);
    }

    /**
     * @inheritDoc
     */
    public function setUpdatedAt($updatedAt)
    {
        return $this->setData(self::UPDATED_AT, $updatedAt);
    }

    /**
     * @inheritDoc
     */
    public function getProductId()
    {
        return $this->_get(self::PRODUCT_ID);
    }

    /**
     * @inheritDoc
     */
    public function setProductId($productId)
    {
        return $this->setData(self::PRODUCT_ID, $productId);
    }

    /**
     * Get product name
     *
     * @return null|string|void
     * @throws \Magento\Framework\Exception\NoSuchEntityException
     */
    public function getProductName()
    {
        $product = $this->productRepository->getById($this->getProductId());
        if ($product) {
            return $product->getName();
        }
    }

    /**
     * Retrieve existing extension attributes object or create a new one.
     *
     * @return AnswerExtensionInterface|null
     */
    public function getExtensionAttributes()
    {
        return $this->_getExtensionAttributes();
    }

    /**
     * Set an extension attributes object.
     *
     * @param AnswerExtensionInterface $extensionAttributes
     * @return $this
     */
    public function setExtensionAttributes(
        AnswerExtensionInterface $extensionAttributes
    ) {
        return $this->_setExtensionAttributes($extensionAttributes);
    }
}
