<?php

namespace Leadlion\Autogedal\Model\ItemProvider;

use Magento\Sitemap\Model\ResourceModel\Catalog\ProductFactory;
use Magento\Sitemap\Model\SitemapItemInterfaceFactory;
use Magento\Sitemap\Model\ItemProvider\ItemProviderInterface;
use Magento\Sitemap\Model\ItemProvider\ConfigReaderInterface;
use Zemez\Blog\Model\ResourceModel\Post\CollectionFactory;
use Zemez\Blog\Model\Url;

#[\AllowDynamicProperties] class Blog implements ItemProviderInterface
{
    protected $postCollectionFactory;

    /**
     * Sitemap item factory
     *
     * @var SitemapItemInterfaceFactory
     */
    private $itemFactory;

    /**
     * Config reader
     *
     * @var ConfigReaderInterface
     */
    private $configReader;

    /**
     * Url Builder
     *
     * @var \Magento\Framework\UrlInterface
     */
    protected $_urlBuilder;
    protected $_urlModel;

    /**
     * ProductSitemapItemResolver constructor.
     *
     * @param ConfigReaderInterface $configReader
     * @param ProductFactory $productFactory
     * @param SitemapItemInterfaceFactory $itemFactory
     */
    public function __construct(
        ConfigReaderInterface $configReader,
        CollectionFactory $postCollectionFactory,
        SitemapItemInterfaceFactory $itemFactory,
        \Magento\Framework\UrlInterface $urlBuilder,
        Url $url
    ) {
        $this->itemFactory = $itemFactory;
        $this->configReader = $configReader;
        $this->_postCollectionFactory = $postCollectionFactory;
        $this->_urlBuilder = $urlBuilder;
        $this->_urlModel = $url;
    }

    /**
     * {@inheritdoc}
     */
    public function getItems($storeId)
    {
        $collection = $this->_postCollectionFactory->create();
        $collection
            ->addFieldToFilter('is_visible', true)
            ->addStoreFilter(0);
        
        $items = array_map(function ($item) use ($storeId) {
            return $this->itemFactory->create([
                'url' => $this->getPostUrl($item),
                'updatedAt' => $item->getUpdateTime(),
                'images' => $item->getImage(),
                'priority' => $this->configReader->getPriority($storeId),
                'changeFrequency' => $this->configReader->getChangeFrequency($storeId),
            ]);
        }, $collection->getItems());

        return $items;
    }

    public function getPostUrl($post)
    {
        return $this->getUrl($this->_urlModel->getPostRoute($post));
    }

    /**
     * Generate url by route and parameters
     *
     * @param   string $route
     * @param   array $params
     * @return  string
     */
    public function getUrl($route = '', $params = [])
    {
        return $this->_urlBuilder->getUrl($route, $params);
    }
}
