<?php

namespace Leadlion\SmartBill\Plugin;

use Magento\Framework\DB\Select;
use Magento\Framework\Message\ManagerInterface as MessageManager;
use Magento\Framework\View\Element\UiComponent\DataProvider\CollectionFactory;
use Magento\Sales\Model\ResourceModel\Order\Grid\Collection as SalesOrderGridCollection;
use Magento\Sales\Model\ResourceModel\Order\Invoice\Orders\Grid\Collection as SalesOrderInvoiceGridCollection;

class GridJoinCollection
{
    private $messageManager;
    private $orderCollection;
    private $invoiceCollection;

    /**
     * @param MessageManager $messageManager
     * @param SalesOrderGridCollection $orderCollection
     * @param SalesOrderInvoiceGridCollection $invoiceCollection
     */
    public function __construct(
        MessageManager           $messageManager,
        SalesOrderGridCollection $orderCollection,
        SalesOrderInvoiceGridCollection $invoiceCollection
    )
    {

        $this->messageManager = $messageManager;
        $this->orderCollection = $orderCollection;
        $this->invoiceCollection = $invoiceCollection;
    }

    /**
     * @param CollectionFactory $subject
     * @param \Closure $proceed
     * @param $requestName
     *
     * @return SalesOrderGridCollection|mixed
     * @throws \Zend_Db_Select_Exception
     */
    public function aroundGetReport(
        CollectionFactory $subject,
        \Closure          $proceed,
                          $requestName
    )
    {
        $result = $proceed($requestName);
        if (($result instanceof $this->orderCollection || $result instanceof $this->invoiceCollection) &&
            in_array($requestName,  ['sales_order_grid_data_source', 'sales_order_invoice_grid_data_source'])) {

            if ($requestName ===  'sales_order_grid_data_source') {
                $field = 'entity_id';
            } else {
                $field = 'order_id';
            }
            $select = $result->getSelect();
            $columns = $select->getPart(Select::COLUMNS);

            if (count(array_intersect(['sm_number'], $this->filterForTableNames($columns))) === 0) {
                $select->joinLeft(
                    ['sm_number' => 'smartbill_invoice'],
                    'sm_number.order_id=`main_table`.'.$field,
                    [
                        'smartbill_invoice' => new \Zend_Db_Expr('CONCAT(sm_number.smartbill_series, sm_number.smartbill_invoice_id)'),
                        'smartbill_document_url'
                    ]
                );
            }
            return $result;
        }

        return $result;
    }

    private function filterForTableNames(array $columns)
    {
        $tableNames = [];
        foreach ($columns as $column) {
            $tableNames[] = $column[0];
        }
        return $tableNames;
    }
}