<?php
/**
 * Copyright © 2018 EaDesign by Eco Active S.R.L. All rights reserved.
 * See LICENSE for license details.
 */

namespace Eadesigndev\FanCourier\Model;

use Eadesigndev\Awb\Api\AwbRepositoryInterFace;
use Eadesigndev\Awb\Model\AwbRepository;
use Eadesigndev\Urgent\Api\Data\GenerateAwbInterface;
use Fancourier\Fancourier;
use Fancourier\Request\CreateAwb;
use Magento\Framework\App\Config\ScopeConfigInterface;
use Magento\Framework\Data\Collection\AbstractDb;
use Magento\Framework\Model\AbstractModel;
use Magento\Framework\Model\Context;
use Magento\Framework\Model\ResourceModel\AbstractResource as AbstractResourceModel;
use Magento\Framework\Registry;
use Magento\Quote\Model\Quote\Address\RateRequest;
use Magento\Sales\Api\OrderRepositoryInterface;

#[\AllowDynamicProperties]
class GenerateAwb extends AbstractModel implements GenerateAwbInterface
{
    const CONFIG_KEY_ACTIVE     = "carriers/fancourier_customshipping/active";
    const CONFIG_KEY_USERNAME   = "carriers/fancourier_customshipping/username";
    const CONFIG_KEY_PASSWORD   = "carriers/fancourier_customshipping/password";
    const CONFIG_KEY_CLIENTID   = "carriers/fancourier_customshipping/clientid";
    public $fanConnector;

    private $_localContext;

    protected $_request;
    protected $_orderRepository;
    protected $_awbRepository;
    protected $_scopeConfig;

    public function __construct(
        Context $context,
        Registry $registry,
        CreateAwb $fanConnector,
        RateRequest $request,
        OrderRepositoryInterface $orderRepository,
        AwbRepository $awbRepository,
        ScopeConfigInterface $scopeConfig,
        AwbRepositoryInterface $awbRepositoryInterFace,
        AbstractResourceModel $resource = null,
        AbstractDb $resourceCollection = null,
        array $data = []
    ) {
        $this->_localContext = $context;
        $this->fanConnector = $fanConnector;
        $this->_request = $request;
        $this->_orderRepository = $orderRepository;
        $this->_awbRepository = $awbRepository;
        $this->_scopeConfig = $scopeConfig;
        $this->awbRepositoryInterface    = $awbRepositoryInterFace;

        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);

        if (!$this->_scopeConfig->getValue(self::CONFIG_KEY_ACTIVE)) {
            return false;
        }

        $username = $this->_scopeConfig->getValue(self::CONFIG_KEY_USERNAME);
        $password = $this->_scopeConfig->getValue(self::CONFIG_KEY_PASSWORD);
        $defaultClientId = $this->_scopeConfig->getValue(self::CONFIG_KEY_CLIENTID);

        $clientId = $defaultClientId;
        if (!empty($model->getData('awb_pickup_id'))) {
            $clientId = $model->getData('awb_pickup_id');
        }

        $fan = new Fancourier($clientId, $username, $password);

        $this->fanConnector
            ->setParcels($model->getData('packages'))
            ->setEnvelopes($model->getData('envelopes'))
            ->setWeight($model->getData('weight'))
            ->setReimbursement($model->getData('delivery_payment'))
            ->setReimbursement($model->getData('payment_method'))
            ->setRecipient($model->getData('recipient'))
            ->setPhone($model->getData('telephone'))
            ->setRegion($model->getData('region_id'))
            ->setCity($model->getData('city'))
            ->setStreet($model->getData('street'))
            ->setDeclaredValue($model->getData('repayment_value'))
            ->setService($model->getData('tariff_plan'))
            ->setEmail($model->getData('customer_email'))
            ->setPostalCode($model->getData('postcode'))
            ;

        if (!empty($model->getData('comments'))) {
            $this->fanConnector->setNotes($model->getData('comments'));
        }

        if (!empty($model->getData('content'))) {
            $this->fanConnector->setContents($model->getData('content'));
        }

        $tmpOptions = [];
        if (!empty($model->getData('delivery_saturday'))) {
            $tmpOptions[] = "S";
        }
        if (!empty($model->getData('open_package'))) {
            $tmpOptions[] = "A";
        }
        $this->fanConnector->setOptions(implode(",", $tmpOptions));

        $response = $fan->createAwb($this->fanConnector);
        if ($response->isOk()) {
            return $response->getBody();
        } else {
            return false;
        }
    }

    public function deleteAwb($awbNumber)
    {
        $model = $this->_awbRepository->getByAwbNumber($awbNumber);

        $username = $this->_scopeConfig->getValue(self::CONFIG_KEY_USERNAME);
        $password = $this->_scopeConfig->getValue(self::CONFIG_KEY_PASSWORD);
        $defaultClientId = $this->_scopeConfig->getValue(self::CONFIG_KEY_CLIENTID);

        $clientId = $defaultClientId;
        if (!empty($model->getData('awb_pickup_id'))) {
            $clientId = $model->getData('awb_pickup_id');
        }

        $fan = new Fancourier($clientId, $username, $password);

        $request = new \Fancourier\Request\DeleteAwb();
        $request->setAwb($awbNumber);

        $response = $fan->deleteAwb($request);
        return $response->isOk();
    }

    public function getPunctRidicare()
    {
        // TODO: Implement getPunctRidicare() method.
    }
}