<?php
/**
 * @copyright: Copyright © 2017 Firebear Studio. All rights reserved.
 * @author   : Firebear Studio <fbeardev@gmail.com>
 */

namespace Firebear\ImportExport\Observer;

use Firebear\ImportExport\Model\ExportJob;
use Firebear\ImportExport\Model\ExportJobFactory;
use Magento\Framework\App\ResourceConnection;
use Magento\Framework\Event\Observer;
use Magento\Framework\Event\ObserverInterface;
use Magento\Framework\MessageQueue\PublisherInterface;

/**
 * Spout message observer
 */
class ExportJobObserver implements ObserverInterface
{
    public const TOPIC_NAME = 'import_export.firebear_export';

    /**
     * Export factory
     *
     * @var ExportJobFactory
     */
    protected $_exportJobFactory;

    /**
     * Resource Connection
     *
     * @var ResourceConnection
     */
    protected $_resource;

    /**
     * @var PublisherInterface
     */
    protected $_publisher;

    /**
     * ExportJobObserver constructor.
     *
     * @param ExportJobFactory $exportJobFactory
     * @param ResourceConnection $resource
     * @param PublisherInterface $publisher
     */
    public function __construct(
        ExportJobFactory $exportJobFactory,
        ResourceConnection $resource,
        PublisherInterface $publisher
    ) {
        $this->_exportJobFactory = $exportJobFactory;
        $this->_resource = $resource;
        $this->_publisher = $publisher;
    }

    /**
     * Run export job
     *
     * @param Observer $observer
     * @return void
     */
    public function execute(Observer $observer)
    {
        $name = $observer->getEvent()->getName();

        $collection = $this->_exportJobFactory->create()->getCollection();
        $collection->getSelect()->join(
            ['ev' => $this->_resource->getTableName('firebear_export_jobs_event')],
            'main_table.entity_id = ev.job_id',
            []
        )->where('ev.event = ?', $name);

        /** @var ExportJob $job */
        foreach ($collection as $job) {
            if ($job->getIsActive()) {
                $this->_publisher->publish(self::TOPIC_NAME, $job->getId());
            }
        }
    }
}
