<?php
/**
 * Mageplaza
 *
 * NOTICE OF LICENSE
 *
 * This source file is subject to the Mageplaza.com license that is
 * available through the world-wide-web at this URL:
 * https://www.mageplaza.com/LICENSE.txt
 *
 * DISCLAIMER
 *
 * Do not edit or add to this file if you wish to upgrade this extension to newer
 * version in the future.
 *
 * @category    Mageplaza
 * @package     Mageplaza_EditOrder
 * @copyright   Copyright (c) Mageplaza (https://www.mageplaza.com/)
 * @license     https://www.mageplaza.com/LICENSE.txt
 */

namespace Mageplaza\EditOrder\Model;

use Exception;
use Magento\Framework\Model\AbstractModel;
use Magento\Sales\Model\Order\Creditmemo\ItemFactory as CreditmemoItemFactory;
use Magento\Sales\Model\Order\Invoice\ItemFactory as InvoiceItemFactory;
use Magento\Sales\Model\Order\ItemFactory;
use Magento\Sales\Model\Order\Shipment\ItemFactory as ShipmentItemFactory;
use Magento\Framework\Model\Context;
use Magento\Framework\Registry;

class OrderManager extends AbstractModel
{
    /**
     * @var InvoiceItemFactory
     */
    protected $invoiceItemFactory;

    /**
     * @var CreditmemoItemFactory
     */
    protected $creditmemoItemFactory;

    /**
     * @var ShipmentItemFactory
     */
    protected $shipmentItemFactory;

    /**
     * @var ItemFactory
     */
    protected $orderItemFactory;

    /**
     * @param Context $context
     * @param Registry $registry
     * @param InvoiceItemFactory $invoiceItemFactory
     * @param CreditmemoItemFactory $creditmemoItemFactory
     * @param ShipmentItemFactory $shipmentItemFactory
     */
    public function __construct(
        Context $context,
        Registry $registry,
        InvoiceItemFactory $invoiceItemFactory,
        CreditmemoItemFactory $creditmemoItemFactory,
        ShipmentItemFactory $shipmentItemFactory
    ) {
        parent::__construct($context, $registry); // Pass the parameters to the parent class's constructor
        $this->invoiceItemFactory = $invoiceItemFactory;
        $this->creditmemoItemFactory = $creditmemoItemFactory;
        $this->shipmentItemFactory = $shipmentItemFactory;
    }
    /**
     * @param $order
     *
     * @return OrderManager
     * @throws Exception|Exception
     */
    public function updateItemManager($order)
    {
        $invoices = [];
        $creditMemos = [];
        $shipments = [];

        $invoiceItemFactory = $this->invoiceItemFactory->create();
        $creditmemoItemFactory = $this->creditmemoItemFactory->create();
        $shipmentItemFactory = $this->shipmentItemFactory->create();

        foreach ($order->getInvoiceCollection() as $invoice) {
            $invoices[] = $invoice;
        }

        foreach ($order->getCreditmemosCollection() as $creditmemo) {
            $creditMemos[] = $creditmemo;
        }

        foreach ($order->getShipmentsCollection() as $ship) {
            $shipments[] = $ship;
        }
        foreach ($order->getAllItems() as $orderItem) {
            foreach ($invoices as $invoice) {
                foreach ($invoice->getItems() as $item) {
                    if ($item->getEntityId()) {
                        $invoiceItemFactory->load($item->getEntityId());
                        if ($item->getOrderItemId() === $orderItem->getItemId()) {
                            $invoiceItemFactory->setOrderItemData(json_encode($orderItem->getData()));
                            $invoiceItemFactory->save();
                        }
                    }
                }
            }

            foreach ($creditMemos as $creditmemo) {
                foreach ($creditmemo->getItems() as $item) {
                    if ($item->getEntityId()) {
                        $creditmemoItemFactory->load($item->getEntityId());
                        if ($item->getOrderItemId() === $orderItem->getItemId()) {
                            $creditmemoItemFactory->setOrderItemData(json_encode($orderItem->getData()));
                            $creditmemoItemFactory->save();
                        }
                    }
                }
            }

            foreach ($shipments as $shipment) {
                foreach ($shipment->getItems() as $item) {
                    if ($item->getEntityId()) {
                        $shipmentItemFactory->load($item->getEntityId());
                        if ($item->getOrderItemId() === $orderItem->getItemId()) {
                            $shipmentItemFactory->setOrderItemData(json_encode($orderItem->getData()));
                            $shipmentItemFactory->save();
                        }
                    }
                }
            }
        }
        return $this;
    }
}
