<?php

namespace Eadesigndev\Sameday\Model;

use Magento\Sales\Api\OrderRepositoryInterface;
use Sameday\Objects\ParcelDimensionsObject;
use Sameday\Objects\PostAwb\Request\AwbRecipientEntityObject;
use Sameday\Objects\Types\AwbPaymentType;
use Sameday\Objects\Types\PackageType;
use Sameday\Objects\Types\CodCollectorType;
use Sameday\Requests\SamedayPostAwbRequest;
use Sameday\Responses\SamedayPostAwbResponse;
use Eadesigndev\Sameday\Helper\ApiHelper;
use Magento\Framework\Message\ManagerInterface;
use Eadesigndev\Awb\Model\AwbRepository;
use Eadesigndev\Awb\Api\AwbRepositoryInterFace;
use Eadesigndev\Urgent\Api\Data\GenerateAwbInterface;
use Eadesigndev\Urgent\Model\Sources\DeliveryPayment;
use Magento\Framework\Registry;
use Magento\Framework\Model\Context;
use Magento\Framework\Model\AbstractModel;
use Magento\Framework\Data\Collection\AbstractDb;
use Magento\Framework\Model\ResourceModel\AbstractResource as AbstractResourceModel;
use Magento\Quote\Model\Quote\Address\RateRequest;
use Magento\Framework\App\Config\ScopeConfigInterface;
use Sameday\Requests\SamedayDeleteAwbRequest;

#[\AllowDynamicProperties]
class GenerateAwb extends AbstractModel implements GenerateAwbInterface
{
    const ADMIN_RESOURCE = 'Magento_Sales::hold';

    private $_localContext;

    protected $_request;
    protected $_orderRepository;
    protected $_awbRepository;
    protected $_scopeConfig;
    protected $awbFactory;
    protected $apiHelper;
    protected $manager;

    public function __construct(
        Context $context,
        Registry $registry,
        RateRequest $request,
        AwbRepository $awbRepository,
        ScopeConfigInterface $scopeConfig,
        AwbRepositoryInterface $awbRepositoryInterFace,
        ApiHelper $apiHelper,
        ManagerInterface $manager,
        OrderRepositoryInterface $_orderRepository,
        ?AbstractResourceModel $resource = null,
        ?AbstractDb $resourceCollection = null,
        array $data = []
    ) {
        $this->_localContext = $context;
        $this->_request = $request;
        $this->_orderRepository = $_orderRepository;
        $this->_awbRepository = $awbRepository;
        $this->_scopeConfig = $scopeConfig;
        $this->awbRepositoryInterface    = $awbRepositoryInterFace;
        $this->apiHelper = $apiHelper;
        $this->manager = $manager;

        parent::__construct($context, $registry, $resource, $resourceCollection, $data);
    }

    public function getGenerateAwb()
    {
        // TODO: Implement getGenerateAwb() method.
    }

    public function setGenerateAwb($awbId)
    {
        // TODO: Implement setGenerateAwb() method.
    }

    public function generateAwb($awbId)
    {
        $model = $this->_awbRepository->getById($awbId);
        $orderId = $model['order_id'];
        $order = $this->_orderRepository->get($orderId);
        $orderPayment = $order->getPayment()->getMethodInstance()->getCode();
        if ($orderPayment == 'mobilpay') {
            $repayment = 0;
        } else {
            $repayment = $model['repayment_value'];
        }
        $insuredValue = 0;
        $packageWeight = $model['weight'] >= 1 ? $model['weight'] : 1;
        $localityName = $this->apiHelper->removeDiacritics($model->getData('city'));
        $countyName = $this->apiHelper->removeDiacritics($model->getData('region_id'));
        $countyName   = $this->apiHelper->mapCountyName($countyName);
        $apiRequest = new SamedayPostAwbRequest(
            $model['awb_pickup_id'],
            null,
            (new PackageType(PackageType::PARCEL)),
            [(new ParcelDimensionsObject($packageWeight))],
            $model['tariff_plan'],
            (new AwbPaymentType(AwbPaymentType::CLIENT)),
            (new AwbRecipientEntityObject(
                $localityName,
                $countyName,
                $order->getShippingAddress()->getStreet()[0],
                $order->getShippingAddress()->getFirstname() . ' ' . $order->getShippingAddress()->getLastname(),
                $order->getShippingAddress()->getTelephone(),
                $order->getCustomerEmail()
            )),
            $insuredValue,
            $repayment,
            (new CodCollectorType( CodCollectorType::CLIENT)),
            null,
            [],
            null,
            $model['order_id'],
            $model['content']?:'',
            null,
            $model['comment'],
            null
        );

        /** @var SamedayPostAwbResponse|false $response */
        $response = $this->apiHelper->doRequest($apiRequest, 'postAwb');

        if ($response) {
            $objectManager = \Magento\Framework\App\ObjectManager::getInstance();
            $serializer = $objectManager->create(\Magento\Framework\Serialize\SerializerInterface::class);
            $parcels = $serializer->serialize($response->getParcels());

            $model->setData('awb_cost', $repayment);
            $model->setData('parcels', $parcels);

            $this->_awbRepository->save($model);
            return $response->getAwbNumber();
        }
    }

    public function deleteAwb($awbNumber)
    {
        $model = $this->_awbRepository->getByAwbNumber($awbNumber);

        $apiRequest = new SamedayDeleteAwbRequest($awbNumber);
        $response = $this->apiHelper->doRequest($apiRequest, 'deleteAwb');
        if ($response) {
            return true;
        }
    }

    public function getPunctRidicare()
    {
        // TODO: Implement getPunctRidicare() method.
    }
}
