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

namespace Magediary\ProductQuestion\Model;

use Magento\Catalog\Model\Product;
use Magediary\ProductQuestion\Api\Data\QuestionInterface;
use Magediary\ProductQuestion\Api\Data\QuestionInterfaceFactory;
use Magento\Framework\Api\DataObjectHelper;
use Magento\Framework\Model\AbstractModel;

class Question extends AbstractModel
{
    public const STATUS_PENDING = 0;
    public const STATUS_APPROVED = 1;
    public const STATUS_NOT_APPROVED = 2;

    public const TYPE_GUEST = 1;
    public const TYPE_CUSTOMER = 2;
    public const TYPE_ADMIN = 3;

    /**
     * Cache tag question_block
     */
    public const CACHE_TAG = 'question_block';

    /**
     * @var QuestionInterfaceFactory
     */
    protected $questionDataFactory;

    /**
     * @var DataObjectHelper
     */
    protected $dataObjectHelper;

    /**
     * @var string
     */
    protected $_eventPrefix = 'magediary_productquestion_question';

    /**
     * @var \Magento\Catalog\Model\ResourceModel\Product\Collection
     */
    protected $_productCollectionFactory;

    /**
     * @param \Magento\Framework\Model\Context $context
     * @param \Magento\Framework\Registry $registry
     * @param QuestionInterfaceFactory $questionDataFactory
     * @param DataObjectHelper $dataObjectHelper
     * @param ResourceModel\Question $resource
     * @param ResourceModel\Question\Collection $resourceCollection
     * @param \Magento\Catalog\Model\ResourceModel\Product\CollectionFactory $productCollectionFactory
     * @param array $data
     */
    public function __construct(
        \Magento\Framework\Model\Context $context,
        \Magento\Framework\Registry $registry,
        QuestionInterfaceFactory $questionDataFactory,
        DataObjectHelper $dataObjectHelper,
        \Magediary\ProductQuestion\Model\ResourceModel\Question $resource,
        \Magediary\ProductQuestion\Model\ResourceModel\Question\Collection $resourceCollection,
        \Magento\Catalog\Model\ResourceModel\Product\CollectionFactory $productCollectionFactory,
        array $data = []
    ) {
        $this->questionDataFactory = $questionDataFactory;
        $this->dataObjectHelper = $dataObjectHelper;
        $this->_productCollectionFactory = $productCollectionFactory;
        parent::__construct($context, $registry, $resource, $resourceCollection, $data);
    }

    /**
     * Retrieve question model with question data
     *
     * @return QuestionInterface
     */
    public function getDataModel()
    {
        $questionData = $this->getData();

        $questionDataObject = $this->questionDataFactory->create();
        $this->dataObjectHelper->populateWithArray(
            $questionDataObject,
            $questionData,
            QuestionInterface::class
        );

        return $questionDataObject;
    }

    /**
     * Validate question form fields
     *
     * @return bool|string[]
     */
    public function validate()
    {
        $errors = [];

        if ($this->getDetail() == '') {
            $errors[] = __('Please enter a question.');
        }

        if (empty($errors)) {
            return true;
        }
        return $errors;
    }

    /**
     * Retrieve products
     *
     * @return \Magento\Catalog\Model\ResourceModel\Product\CollectionFactory
     */
    public function getRelatedProducts()
    {
        if (!$this->hasData('related_products')) {
            $collection = $this->_productCollectionFactory->create();
            if ($this->getStoreId()) {
                $collection->addStoreFilter($this->getStoreId());
            }

            $collection->getSelect()->joinLeft(
                ['rl' => $this->getResource()->getTable('magediary_question_product')],
                'e.entity_id = rl.product_id',
                []
            )->where(
                'rl.question_id = ?',
                $this->getId()
            );

            $this->setData('related_products', $collection);
        }

        return $this->getData('related_products');
    }

    /**
     * Return unique ID(s) for each object in system
     *
     * @return array
     */
    public function getIdentities()
    {
        $tags = [];
        if ($this->getProductId()) {
            $tags[] = Product::CACHE_TAG . '_' . $this->getProductId();
        }
        return $tags;
    }
}
