<?php

namespace Dotdigitalgroup\Email\Plugin;

/**
 * Class ReportsProductCollection
 *
 * @SuppressWarnings(PHPMD.UnusedFormalParameter)
 */
class ReportsProductCollectionPlugin
{
    /**
     * @var \Magento\Reports\Model\Event\TypeFactory
     */
    private $eventTypeFactory;

    /**
     * ReportsProductCollection constructor.
     *
     * @param \Magento\Reports\Model\Event\TypeFactory $typeFactory
     */
    public function __construct(\Magento\Reports\Model\Event\TypeFactory $typeFactory)
    {
        $this->eventTypeFactory = $typeFactory;
    }

    /**
     * @param \Magento\Reports\Model\ResourceModel\Product\Collection $collection
     * @param callable $proceed
     * @param string $from
     * @param string $to
     *
     * @return \Magento\Reports\Model\ResourceModel\Product\Collection
     */
    public function aroundAddViewsCount(
        \Magento\Reports\Model\ResourceModel\Product\Collection $collection,
        callable $proceed,
        $from = '',
        $to = ''
    ) {
        /**
         * Getting event type id for catalog_product_view event
         */
        $eventTypes = $this->eventTypeFactory->create()->getCollection();
        foreach ($eventTypes as $eventType) {
            if ($eventType->getEventName() == 'catalog_product_view') {
                $productViewEvent = (int)$eventType->getId();
                break;
            }
        }

        $collection->getSelect()->reset()->from(
            ['report_table_views' => $collection->getTable('report_event')],
            ['views' => 'COUNT(report_table_views.event_id)']
        )->join(
            ['e' => $collection->getProductEntityTableName()],
            'e.entity_id = report_table_views.object_id'
        )->where(
            'report_table_views.event_type_id = ?',
            $productViewEvent
        )->group(
            'e.entity_id'
        )->order(
            'views ' . $collection::SORT_ORDER_DESC
        )->having(
            'COUNT(report_table_views.event_id) > ?',
            0
        );

        if ($from != '' && $to != '') {
            $collection->getSelect()->where('logged_at >= ?', $from)->where('logged_at <= ?', $to);
        }
        
        return $collection;
    }
}