<?php
declare(strict_types=1);

namespace Autogedal\Manufacturers\Ui\DataProvider\Page;

use Autogedal\Manufacturers\Model\Config as ManufacturersConfig;
use Autogedal\Manufacturers\Model\ResourceModel\ManufacturerPage\Grid\Collection;
use Autogedal\Manufacturers\Model\ResourceModel\ManufacturerPage\Grid\CollectionFactory as GridCollectionFactory;
use Magento\Eav\Model\ResourceModel\Entity\Attribute\Option\CollectionFactory as OptionCollectionFactory;
use Magento\Framework\Api\FilterBuilder;
use Magento\Framework\Api\Search\ReportingInterface;
use Magento\Framework\Api\Search\SearchCriteriaBuilder;
use Magento\Framework\App\RequestInterface;
use Magento\Framework\View\Element\UiComponent\DataProvider\DataProvider;

class ListingDataProvider extends DataProvider
{
    private ?Collection $collection = null;

    public function __construct(
        $name,
        $primaryFieldName,
        $requestFieldName,
        ReportingInterface $reporting,
        SearchCriteriaBuilder $searchCriteriaBuilder,
        RequestInterface $request,
        FilterBuilder $filterBuilder,
        private readonly ManufacturersConfig $manufacturersConfig,
        private readonly OptionCollectionFactory $optionCollectionFactory,
        private readonly GridCollectionFactory $gridCollectionFactory,
        array $meta = [],
        array $data = []
    ) {
        parent::__construct(
            $name,
            $primaryFieldName,
            $requestFieldName,
            $reporting,
            $searchCriteriaBuilder,
            $request,
            $filterBuilder,
            $meta,
            $data
        );
    }

    public function getData(): array
    {
        $data = $this->getCollection()->load()->toArray();
        $options = $this->optionCollectionFactory->create()
            ->setAttributeFilter($this->manufacturersConfig->getProductAttributeId())
            ->setStoreFilter();

        foreach ($data['items'] as &$item) {
            $option = $options->getItemById($item['option_id']);
            if ($option) {
                $item['option_id'] = $option->getValue();
            }
        }

        return $data;
    }

    public function getCollection(): Collection
    {
        return $this->collection ??= $this->gridCollectionFactory->create();
    }
}
