<?php

namespace Leadlion\Autogedal\Cron;

use Magento\Catalog\Model\ResourceModel\Product\CollectionFactory as ProductCollectionFactory;
use Magento\CatalogInventory\Api\StockRegistryInterface;
use Magento\InventoryApi\Api\Data\SourceItemInterfaceFactory;
use Magento\InventoryCatalog\Model\ResourceModel\SetDataToLegacyStockItem;
use Magento\Framework\App\ResourceConnection;
use Magento\InventoryCatalog\Model\ResourceModel\SetDataToLegacyStockStatus;
use Magento\Inventory\Model\SourceItem\Command\Handler\SourceItemsSaveHandler;
use Monolog\Logger as MonoLogger;
use Monolog\Handler\StreamHandler;
use Monolog\Level;

class LaComandaFromOos
{
    protected $productCollectionFactory;
    protected $stockRegistry;

    /**
     * @var SourceItemsSaveHandler
     */
    private $sourceItemsSaveHandler;

    /**
     * @var SourceItemInterfaceFactory
     */
    private $sourceItemFactory;

    /**
     * @var ResourceConnection
     */
    private $resourceConnection;

    /**
     * @var SetDataToLegacyStockItem
     */
    private $setDataToLegacyStockItem;
    
    /**
     * @var SetDataToLegacyStockStatus
     */
    private $setDataToLegacyStockStatus;

    public function __construct(
        ProductCollectionFactory $productCollectionFactory,
        StockRegistryInterface $stockRegistry,
        SourceItemInterfaceFactory $sourceItemFactory,
        SetDataToLegacyStockItem $setDataToLegacyStockItem,
        ResourceConnection $resourceConnection,
        SetDataToLegacyStockStatus $setDataToLegacyStockStatus,
        SourceItemsSaveHandler $sourceItemsSaveHandler
    ) {
        $this->productCollectionFactory = $productCollectionFactory;
        $this->stockRegistry = $stockRegistry;
        $this->sourceItemFactory = $sourceItemFactory;
        $this->setDataToLegacyStockItem = $setDataToLegacyStockItem;
        $this->resourceConnection = $resourceConnection;
        $this->setDataToLegacyStockStatus = $setDataToLegacyStockStatus;
        $this->sourceItemsSaveHandler = $sourceItemsSaveHandler;
    }

    public function execute()
    {
        try {
            $monolog = new MonoLogger('la_comanda_from_oos');
            $monolog->pushHandler(new StreamHandler(BP . '/var/log/la_comanda_from_oos.log', Level::Debug));
            $logger = $monolog;

            $collection = $this->productCollectionFactory->create()
                ->addAttributeToSelect(['sku', 'name'])
                ->addAttributeToFilter('status', \Magento\Catalog\Model\Product\Attribute\Source\Status::STATUS_ENABLED)
                ->addAttributeToFilter('keep_out_of_stock', ['neq' => 1])
                ->addAttributeToFilter('manually_out_of_stock', ['neq' => 1])
                ->addAttributeToFilter('type_id', ['in' => ['simple']])
                ->joinField(
                    'is_in_stock',
                    'cataloginventory_stock_item',
                    'is_in_stock',
                    'product_id=entity_id',
                    '{{table}}.stock_id=1',
                    'left'
                )
                ->addFieldToFilter('is_in_stock', ['eq' => 0]);

            $sourceItems = [];
            $logger->info('---------------------------------------------------------------------');
            $logger->info(count($collection));
            foreach ($collection as $product) {
                $sku = $product->getSku();
                $qty = 0;

                $logger->info('OOS product pus la comanda: '.$sku);

                $isInStock = 1;

                $sourceItem = $this->sourceItemFactory->create();
                $sourceItem->setData('source_code', 'default');
                $sourceItem->setData('sku', $product->getData('sku'));
                $sourceItem->setData('quantity', $qty);
                $sourceItem->setData('status', $isInStock);
                $sourceItems[] = $sourceItem;
                
                try {
                    $this->setDataToLegacyStockItem->execute(
                        (string)$product->getData('sku'),
                        (float)$qty,
                        $isInStock
                    );
                    $this->setDataToLegacyStockStatus->execute(
                        (string)$product->getData('sku'),
                        (float)$qty,
                        $isInStock
                    );
                } catch (\Exception $e) {
                    $logger->info('(stockRegistry) cant save stock $product sku: ' .$product->getData('sku').$e->getMessage());
                }   
            }
    
            if (!empty($sourceItems)) {
                $this->sourceItemsSaveHandler->execute($sourceItems);
            }
        } catch (\Exception $e) {
            $logger->info('ForceInStock Cron Error: ' . $e->getMessage());
        }
    }
}
