<?php

namespace Autogedal\Extend\Helper;

use Magento\GiftCard\Block\Catalog\Product\View\Type\Giftcard;

/**
 * 
 * Class Item
 * @package Mageplaza\Osc\Helper
 */
class Item extends \Mageplaza\Osc\Helper\Item
{
    /**
     * @param Quote $quote
     * @param QuoteItem|int|bool $item
     * @param bool $displayItem
     *
     * @return array
     */
    public function getItemOptionsConfig($quote, $item, $displayItem)
    {
        $result = [];

        if (!is_object($item)) {
            $item = $quote->getItemById($item);
        }

        if (!$item) {
            return [];
        }
        $product = $item->getProduct();

        $product->setPreconfiguredValues(
            $product->processBuyRequest($item->getBuyRequest())
        );

        $this->registry->unregister('current_product');
        $this->registry->register('current_product', $product);

        if ($product->getOptions()) {
            /** @var Options $options */
            $options = $this->getLayout()->getBlock('mposc.product.options');
            $options->setProduct($product);

            $result['customOptions'] = [
                'template'     => $options->toHtml(),
                'optionConfig' => $options->getJsonConfig()
            ];
        }
        if ($displayItem) {
            switch ($item->getProductType()) {
                case 'configurable':
                    $result['configurableAttributes'] = $this->getConfigurableConfig($item, $product);
                    break;
                case 'bundle':
                    $result['customOptions'] = $this->getBundleConfig($item);
                    break;
                case 'downloadable':
                    $result['customOptions'] = $this->getDownloadableConfig($item);
                    break;
                case 'giftcard':
                    $result['customOptions'] = $this->getGiftCardConfig($item);
                    break;
            }
        }

        return $result;
    }

     /**
     * @param QuoteItem $item
     *
     * @return array
     */
    private function getBundleConfig($item)
    {
        /** @var Bundle $block */
        $block = $this->getLayout()->getBlock('mposc.bundle.options');
        $block->setData([
            'product' => $item->getProduct(),
            'item'    => $item
        ]);
        $block->getOptions(true);

        return [
            'template'     => $block->toHtml(),
            'optionConfig' => $block->getJsonConfig()
        ];
    }

    /**
     * @param QuoteItem $item
     *
     * @return array
     */
    private function getDownloadableConfig($item)
    {
        /** @var Renderer $block */
        $block = $this->getLayout()->getBlock('mposc.downloadable.options');
        $block->setData([
            'product' => $item->getProduct(),
            'item'    => $item
        ]);

        return [
            'template'     => $item->getProduct()->getLinksPurchasedSeparately() ? $block->toHtml() : '',
            'optionConfig' => null
        ];
    }

    /**
     * @param QuoteItem $item
     *
     * @return array
     */
    private function getGiftCardConfig($item)
    {
        /** @var Giftcard $block */
        if (!$block = $this->getLayout()->getBlock('mposc.giftcard.options')) {
            $block = $this->getLayout()->createBlock(
                Giftcard::class,
                'mposc.giftcard.options'
            );
        }

        $block->setTemplate('Mageplaza_Osc::product/view/type/options/giftcard.phtml');
        $block->setData([
            'product' => $item->getProduct(),
            'item'    => $item
        ]);

        return [
            'template'     => $block->toHtml(),
            'optionConfig' => null
        ];
    }

    /**
     * @param QuoteItem $item
     * @param Product $product
     *
     * @return array
     */
    private function getConfigurableConfig($item, $product)
    {
        /** @var Configurable $block */
        $block = $this->getLayout()->getBlock('mposc.configurable.options');
        $block->unsetData('allow_products');
        $block->addData([
            'product'    => $product,
            'quote_item' => $item
        ]);

        $spConfig        = $this->unserialize($block->getJsonConfig());
        $spConfig['sku'] = [];

        return [
            'template' => $block->toHtml(),
            'spConfig' => $this->serialize($spConfig),
        ];
    }
}
