<?php
/**
 * Copyright © Magento, Inc. All rights reserved.
 * See COPYING.txt for license details.
 */
namespace Autogedal\Extend\Model;

use Magento\Checkout\Model\ConfigProviderInterface;
use Magento\GiftMessage\Helper\Message as GiftMessageHelper;
use Magento\Framework\App\Http\Context as HttpContext;
use Magento\Customer\Model\Context as CustomerContext;
use Magento\Framework\UrlInterface;
use Magento\Framework\Locale\FormatInterface as LocaleFormat;
use Magento\Framework\Data\Form\FormKey;
use Magento\Catalog\Model\Product\Attribute\Source\Boolean;
use Magento\Store\Model\ScopeInterface;

/**
 * Configuration provider for GiftMessage rendering on "Checkout cart" page.
 * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
 * @SuppressWarnings(PHPMD.NPathComplexity)
 */
class GiftMessageConfigProvider extends \Magento\GiftMessage\Model\GiftMessageConfigProvider
{
    /**
     * Load already specified item level gift messages and related configuration.
     *
     * @return \Magento\GiftMessage\Api\Data\MessageInterface[]|null
     * @throws \Magento\Framework\Exception\NoSuchEntityException
     */
    protected function getItemLevelGiftMessages()
    {
        $itemLevelConfig = [];
        $quote = $this->checkoutSession->getQuote();
        foreach ($quote->getAllVisibleItems() as $item) {
            $itemId = $item->getId();
            $itemLevelConfig[$itemId] = [];
            $isMessageAvailable = $item->getProduct()->getGiftMessageAvailable();
            // use gift message product setting if it is available
            if ($isMessageAvailable !== null && $isMessageAvailable != Boolean::VALUE_USE_CONFIG) {
                $itemLevelConfig[$itemId]['is_available'] = (bool)$isMessageAvailable;
            }
            try {
                $message = $this->itemRepository->get($quote->getId(), $itemId);
            } catch (\Exception $e) {
                $message = null;
            }
            if ($message) {
                $itemLevelConfig[$itemId]['message'] = $message->getData();
            }
        }
        return count($itemLevelConfig) === 0 ? null : $itemLevelConfig;
    }
}
