<?php

namespace Autogedal\Extend\ViewModel;

use Magento\Catalog\Model\Layer\Resolver;
use Magento\CatalogInventory\Api\StockConfigurationInterface;
use Magento\CatalogInventory\Api\StockStateInterface;
use Magento\CatalogInventory\Model\Spi\StockRegistryProviderInterface;
use Magento\CatalogInventory\Model\Spi\StockStateProviderInterface;
use Magento\Framework\DataObject;
use Magento\Bundle\Model\Product\Type;
use Leadlion\Autogedal\Helper\Data;

class CustomHelper implements \Magento\Framework\View\Element\Block\ArgumentInterface
{
    /**
     * @var  Data
     */
    protected $helper;

    /**
     * @var  Layer
     */
    protected $layer;
    
    /**
     * @var Resolver
     */
    private $layerResolver;

    /**
     * @var StockConfigurationInterface
     */
    protected $stockConfiguration;
    
    /**
     * @var StockRegistryProviderInterface
     */
    protected $stockRegistryProvider;

    /**
     * @var StockStateProviderInterface
     */
    protected $stockStateProvider;

    /**
     * @var  Type
     */
    protected $bundleType;

    public function __construct(
        Resolver $layerResolver,
        StockStateProviderInterface $stockStateProvider,
        StockRegistryProviderInterface $stockRegistryProvider,
        StockConfigurationInterface $stockConfiguration,
        Type $bundleType,
        Data $helper
    ) {
        $this->layerResolver = $layerResolver;
        $this->stockStateProvider = $stockStateProvider;
        $this->stockRegistryProvider = $stockRegistryProvider;
        $this->stockConfiguration = $stockConfiguration;
        $this->bundleType = $bundleType;
        $this->helper = $helper;
    }
    
    public function getAttributesSetsIdsForShowingSku()
    {
        return $this->helper->getAttributesSetsIdsForShowingSku();
    }

    /**
     * Retrieve Required children ids
     * Return grouped array, ex array(
     *   group => array(ids)
     * )
     *
     * @param int $parentId
     * @param bool $required
     * @return array
     */
    public function getChildrenIds($parentId, $required = true)
    {
        return $this->bundleType->getChildrenIds($parentId, $required);
    }

    /**
     * @return \Magento\Catalog\Model\Category
     */
    public function getCurrentCategory()
    {
        return $this->getLayer()->getCurrentCategory();
    }

    /**
     * @return Layer
     */
    private function getLayer()
    {
        if (!$this->layer) {
            $this->layer = $this->layerResolver->get();
        }
        return $this->layer;
    }

    /**
     * Retrieve stock qty whether product is composite or no
     *
     * @param int $productId
     * @param int $scopeId
     * @return float
     */
    public function getStockQty($product, $scopeId = null)
    {
        if ($product->getTypeId() == \Magento\Bundle\Model\Product\Type::TYPE_CODE) {
            $options = $this->bundleType->getOptionsCollection($product);
            $selections = $this->bundleType->getSelectionsCollection($options->getAllIds(), $product);
        
            foreach ($selections as $selection) {
                $simpleProductId = $selection->getEntityId();
                $defaultSimpleQty = $selection->getSelectionQty();

                $scopeId = $this->stockConfiguration->getDefaultScopeId();
                $stockItem = $this->stockRegistryProvider->getStockItem($simpleProductId, $scopeId);
    
                $simpleQty = $this->stockStateProvider->getStockQty($stockItem);
                if ($simpleQty <= 0 || $simpleQty < $defaultSimpleQty) {
                    return 0;
                }
            }
            return 1;
        } else {
            $scopeId = $this->stockConfiguration->getDefaultScopeId();
            $stockItem = $this->stockRegistryProvider->getStockItem($product->getId(), $scopeId);
    
            return $this->stockStateProvider->getStockQty($stockItem);
        }
        
    }
}
