<?php
declare(strict_types=1);

namespace Autogedal\AutogedalHelper\Plugin;

use Magento\Framework\DB\Select;
use Magento\Sales\Model\ResourceModel\Order\Grid\Collection as SalesOrderGridCollection;

class OrderGridCountSelect
{
    /**
     * Remove display-only joins from the count select when they are not used
     * by WHERE/HAVING conditions. This keeps pagination counts cheap.
     */
    public function afterGetSelectCountSql(
        SalesOrderGridCollection $subject,
        Select $countSelect
    ): Select {
        $requiredAliases = $this->findRequiredAliases($subject->getSelect());
        $from = $countSelect->getPart(Select::FROM);

        foreach ($this->displayOnlyAliases() as $alias) {
            if (!isset($from[$alias]) || isset($requiredAliases[$alias])) {
                continue;
            }

            unset($from[$alias]);
        }

        $countSelect->setPart(Select::FROM, $from);
        return $countSelect;
    }

    /**
     * @return array<int, string>
     */
    private function displayOnlyAliases(): array
    {
        return [
            'sm_number',
            'ec',
            'admin_user',
            'soa_telephone',
            'soi_sku',
            'soi_sku_bundle',
            'archive_table',
            'facebook_sales_order',
        ];
    }

    /**
     * @param Select $select
     * @return array<string, true>
     */
    private function findRequiredAliases(Select $select): array
    {
        $requiredAliases = [];
        $parts = array_merge(
            (array)$select->getPart(Select::WHERE),
            (array)$select->getPart(Select::HAVING)
        );

        foreach ($this->displayOnlyAliases() as $alias) {
            foreach ($parts as $part) {
                if (is_string($part) && preg_match('/(?<![A-Za-z0-9_])' . preg_quote($alias, '/') . '(?![A-Za-z0-9_])/', $part)) {
                    $requiredAliases[$alias] = true;
                    break;
                }
            }
        }

        return $requiredAliases;
    }
}
