<?php

namespace Leadlion\StockUpdates\Model;

use Magento\Catalog\Api\ProductRepositoryInterface;
use Magento\Catalog\Model\Product;
use Magento\Catalog\Model\ResourceModel\Product\CollectionFactory;
use Magento\Framework\App\Action\Context;
use Magento\Framework\App\Config\ScopeConfigInterface;
use Magento\InventoryApi\Api\Data\SourceItemInterfaceFactory;
use Magento\InventoryApi\Api\SourceItemsSaveInterface;
use Magento\Store\Model\ScopeInterface;
use SmartBill\Integration\Helper\Data;
use Monolog\Logger as MonoLogger;
use Monolog\Handler\StreamHandler;
use Monolog\Level;

class UpdateUm
{
    const ALWAYS_STOCK_BEHAVIOR = 0;
    const MANAGE_STOCK_BEHAVIOR = 1;
    const IGNORE_STOCK_BEHAVIOR = 2;

    /**
     * @var ScopeConfigInterface|Config
     */
    protected $config;
    /**
     * @var LoggerInterface
     */
    protected $logger;
    /**
     * @var CollectionFactory
     */
    protected $collectionFactory;
    /**
     * @var SmartBillCloudRestClient
     */
    protected $restClient;
    /**
     * @var Data
     */
    private $helper;
    /**
     * @var \Magento\InventoryApi\Api\SourceItemsSaveInterface
     */
    private $sourceItemsSaveInterface;
    /**
     * @var SourceItemInterfaceFactory
     */
    private $sourceItemFactory;
    /**
     * @var ProductRepositoryInterface
     */
    private $productRepository;
    /**
     * @var Context
     */
    private $context;

    /**
     * ProcessProducts constructor.
     * @param State $state
     * @param Config $config
     * @param Handler $handler
     * @param CollectionFactory $collectionFactory
     */
    public function __construct(
        ScopeConfigInterface       $config,
        CollectionFactory          $collectionFactory,
        Data                       $helper,
        SourceItemsSaveInterface   $sourceItemsSaveInterface,
        SourceItemInterfaceFactory $sourceItemFactory,
        ProductRepositoryInterface $productRepository,
        Context                    $context
    )
    {
        $this->helper = $helper;
        $this->config = $config;
        $this->collectionFactory = $collectionFactory;
        $this->sourceItemsSaveInterface = $sourceItemsSaveInterface;
        $this->sourceItemFactory = $sourceItemFactory;
        $this->productRepository = $productRepository;
        $this->context = $context;
    }

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

        $stocks = $this->getStocks();
        $request = $this->context->getRequest();
        foreach ($stocks as $sku => $stockInfo) {
            $qty = $stockInfo['qty'];
            $measuringUnit = $stockInfo['measuringUnit'];
            $sourceItem = $this->sourceItemFactory->create();
            //return all products by sku_fz
            $collection = $this->collectionFactory->create()
                ->addAttributeToSelect('sku_fz')
                ->addAttributeToSelect('sku')
                ->addAttributeToSelect('manufacturer')
                ->addAttributeToSelect('measuringUnitName')
                ->addAttributeToFilter('sku_fz', $sku)
                ->load();
            foreach ($collection as $product) {
                $logger->info($product->getData('sku_fz').' -- sbil um: '.$measuringUnit.' --- m2 um: '. $product->getData('measuringUnitName'));
                if( $product->getData('measuringUnitName') !== $measuringUnit){
                    $product->setData('measuringUnitName', $measuringUnit);
                    $this->productRepository->save($product);
                }

            }
        }

    }

    protected function getStocks()
    {
        try {
            $connector = $this->helper->getSmartBillConnector();
            $data = [
                "cif" => $this->helper->getCompanyVAT(),
                "date" => date('Y-m-d'),
                "warehouseName" => "",
                "productName" => "",
                "productCode" => ""
            ];
            $stocks = $connector->productsStock($data);
            $items = [];
            if (isset($stocks[0]['products'])) {
                foreach ($stocks[0]['products'] as $stock) {
                    if (isset($stock['productCode']) && $stock['productCode']) {
                        $items[$stock['productCode']] = [
                            'qty' => $stock['quantity'],
                            'measuringUnit' => $stock['measuringUnit']
                        ];
                    }
                }
            }

            // Bare transversale stock smartbill
            foreach ($stocks as $key => $info) {
                if (isset($info['warehouse']) &&
                    isset($info['warehouse']['warehouseName']) &&
                    $info['warehouse']['warehouseName'] == 'BARE TRANSVERSALE'
                ) {
                    if (isset($info['products'])) {
                        foreach ($info['products'] as $stock) {
                            if (isset($stock['productCode']) && $stock['productCode']) {
                                $items[$stock['productCode']] = [
                                    'qty' => $stock['quantity'],
                                    'measuringUnit' => $stock['measuringUnit']
                                ];
                            }
                        }
                    }
                }
            }
            return $items;
        } catch (\Exception $e) {

        }
    }

}
