<?php
namespace Eadesigndev\Awb\Model;
use Eadesigndev\Awb\Model\ResourceModel\Collection\Collection;
use Magento\Sales\Model\Order;
use Eadesigndev\Awb\Model\Sources\PickupId;
use Eadesigndev\Awb\Model\Sources\CarrierType;
use Magento\Framework\App\RequestInterface;
use Magento\Sales\Api\OrderRepositoryInterface;

#[\AllowDynamicProperties]
class OrderAwb
{
    public $extraParams = [];
    private Collection $_awbCollection;
    private PickupId $_pickupId;
    private RequestInterface $_request;
    private OrderRepositoryInterface $orderRepository;

    public function __construct(
        Collection $awbCollection,
        PickupId $pickupId,
        RequestInterface $request,
        OrderRepositoryInterface $orderRepository
    )
    {
        $this->_awbCollection = $awbCollection;
        $this->_pickupId = $pickupId;
        $this->_request = $request;
        $this->orderRepository = $orderRepository;
    }

    public function getInfo($direct = false)
    {
        $awbDocuments = $this->_awbCollection->addFieldToFilter('order_id', array('eq' => $this->_request->getParam('order_id')));

        $extraParams = [];
        foreach ($awbDocuments as $awb) {
            $this->_pickupId->setCarrierById($awb->getData('carrier_id'));
            $pickupName = $this->_pickupId->getAvailable()[$awb->getData('awb_pickup_id')] ?? "";

            // If pickup_name is empty, try to load warehouse name from order
            if (empty($pickupName)) {
                try {
                    $orderId = $this->_request->getParam('order_id');
                    /** @var \Magento\Sales\Model\Order $order */
                    $order = $this->orderRepository->get($orderId);
                    $warehouseId = $order->getData('autogedal_allocated_warehouse');

                    if ($warehouseId) {
                        $objectManager = \Magento\Framework\App\ObjectManager::getInstance();
                        $warehouseCollection = $objectManager->create(
                            'Leadlion\AutogedalWarehouses\Model\ResourceModel\Warehouse\CollectionFactory'
                        )->create();

                        $warehouse = $warehouseCollection
                            ->addFieldToFilter('warehouse_id', $warehouseId)
                            ->getFirstItem();

                        if ($warehouse && $warehouse->getId()) {
                            $pickupName = $warehouse->getName();
                        }
                    }
                } catch (\Exception $e) {
                    // If failed to load warehouse, keep pickup_name empty
                }
            }

            $dataToInsert = [
                "awb_number" => $awb->getData('awb_number'),
                "carrier_name" => CarrierType::getAvailableStatic()[$awb->getData('carrier_id')] ?? "",
                "pickup_name" => $pickupName,
                "carrier_id" => $awb->getData('carrier_id'),
                "awb_pickup_id" => $awb->getData('awb_pickup_id'),
            ];

            if (!empty($dataToInsert["awb_number"]) && !empty($dataToInsert["carrier_name"])) {
                $dataToInsert["awb_preview"] = $this->getPreviewUrlOfAwb($dataToInsert["carrier_id"], $dataToInsert["awb_number"], $dataToInsert["awb_pickup_id"]);
            }

            $extraParams[] = $dataToInsert;
        }

        $this->extraParams = $extraParams;

        return $extraParams;
    }

    public function getPreviewUrlOfAwb($carrierId, $awbNumber, $pickupId)
    {
        $objectManager = \Magento\Framework\App\ObjectManager::getInstance();
        $this->previewManager = $objectManager->create('Eadesigndev\Awb\Helper\Preview');

        return $this->previewManager->getPreviewUrl($carrierId, $awbNumber, __('Print'), false, $pickupId);
    }
}