<?php
declare(strict_types=1);

namespace Autogedal\Manufacturers\Block\Adminhtml\System\Config;

use Autogedal\Manufacturers\Model\Config;
use Magento\Backend\Block\Template\Context;
use Magento\Catalog\Model\Product\Attribute\Source\Status;
use Magento\Catalog\Model\ResourceModel\Product\CollectionFactory as ProductCollectionFactory;
use Magento\Config\Block\System\Config\Form\Field;
use Magento\Eav\Model\ResourceModel\Entity\Attribute\Option\CollectionFactory as OptionCollectionFactory;
use Magento\Framework\Data\Form\Element\AbstractElement;
use Magento\Framework\DB\Select;
use Magento\Store\Model\Store;

class InactiveManufacturers extends Field
{
    protected $_template = 'Autogedal_Manufacturers::system/config/inactive_manufacturers.phtml';

    public function __construct(
        Context $context,
        private readonly Config $config,
        private readonly OptionCollectionFactory $optionCollectionFactory,
        private readonly ProductCollectionFactory $productCollectionFactory,
        array $data = []
    ) {
        parent::__construct($context, $data);
    }

    public function getManufacturers(): array
    {
        $attributeId = $this->config->getProductAttributeId();
        if ($attributeId <= 0) {
            return [];
        }

        $productCounts = $this->getProductCounts();
        $options = $this->optionCollectionFactory->create()
            ->setAttributeFilter($attributeId)
            ->setStoreFilter(Store::DEFAULT_STORE_ID);

        $manufacturers = [];
        foreach ($options as $option) {
            $optionId = (int)$option->getOptionId();
            $manufacturers[] = [
                'option_id' => $optionId,
                'name' => (string)$option->getValue(),
                'products' => $productCounts[$optionId]['products'] ?? 0,
                'active_products' => $productCounts[$optionId]['active_products'] ?? 0,
                'is_active' => $this->config->isManufacturerActive($optionId)
            ];
        }

        return $manufacturers;
    }

    protected function _getElementHtml(AbstractElement $element): string
    {
        $this->setData('element', $element);

        return $this->_toHtml();
    }

    private function getProductCounts(): array
    {
        $collection = $this->productCollectionFactory->create();
        $collection->setStoreId(Store::DEFAULT_STORE_ID)
            ->groupByAttribute([$this->config->getProductAttribute(), 'status']);

        $select = $collection->getSelect();
        [$manufacturer, $status] = $select->getPart(Select::GROUP);
        $select->reset(Select::COLUMNS)
            ->columns(['option_id' => $manufacturer, 'status' => $status, 'products' => 'COUNT(*)']);

        $counts = [];
        foreach ($collection->getConnection()->fetchAll($select) as $row) {
            $optionId = (int)$row['option_id'];
            $counts[$optionId]['products'] = ($counts[$optionId]['products'] ?? 0) + (int)$row['products'];
            if ((int)$row['status'] === Status::STATUS_ENABLED) {
                $counts[$optionId]['active_products'] = (int)$row['products'];
            }
        }

        return $counts;
    }
}
