<?php
/**
 * Copyright © Magento, Inc. All rights reserved.
 * See COPYING.txt for license details.
 */
declare(strict_types=1);

namespace Magento\QuoteGraphQl\Model\Cart;

use Magento\Framework\Exception\NoSuchEntityException;
use Magento\Quote\Model\Quote;
use Magento\Quote\Model\Quote\Item as QuoteItem;
use Magento\Quote\Model\QuoteIdToMaskedQuoteIdInterface;

/**
 * Extract data from cart
 */
class ExtractDataFromCart
{
    /**
     * @var QuoteIdToMaskedQuoteIdInterface
     */
    private $quoteIdToMaskedQuoteId;

    /**
     * @param QuoteIdToMaskedQuoteIdInterface $quoteIdToMaskedQuoteId
     */
    public function __construct(
        QuoteIdToMaskedQuoteIdInterface $quoteIdToMaskedQuoteId
    ) {
        $this->quoteIdToMaskedQuoteId = $quoteIdToMaskedQuoteId;
    }

    /**
     * Extract data from cart
     *
     * @param Quote $cart
     * @return array
     * @throws NoSuchEntityException
     */
    public function execute(Quote $cart): array
    {
        $items = [];

        /**
         * @var QuoteItem $cartItem
         */
        foreach ($cart->getAllItems() as $cartItem) {
            $productData = $cartItem->getProduct()->getData();
            $productData['model'] = $cartItem->getProduct();

            $items[] = [
                'id' => $cartItem->getItemId(),
                'qty' => $cartItem->getQty(),
                'product' => $productData,
                'model' => $cartItem,
            ];
        }

        $appliedCoupon = $cart->getCouponCode();

        return [
            'cart_id' => $this->quoteIdToMaskedQuoteId->execute((int)$cart->getId()),
            'items' => $items,
            'applied_coupon' => $appliedCoupon ? ['code' => $appliedCoupon] : null
        ];
    }
}