<?php

namespace Retailcrm\Retailcrm\Model\Observer;

use Magento\Framework\Event\Observer;
use Retailcrm\Retailcrm\Helper\Proxy as ApiClient;
use Retailcrm\Retailcrm\Helper\Data as Helper;

class OrderUpdate implements \Magento\Framework\Event\ObserverInterface
{
    private $api;
    private $config;
    private $registry;
    private $order;
    private $helper;

    /**
     * Constructor
     *
     * @param \Magento\Framework\App\Config\ScopeConfigInterface $config
     * @param \Magento\Framework\Registry $registry
     * @param Helper $helper
     * @param ApiClient $api
     */
    public function __construct(
        \Magento\Framework\App\Config\ScopeConfigInterface $config,
        \Magento\Framework\Registry $registry,
        Helper $helper,
        ApiClient $api
    ) {
        $this->config = $config;
        $this->registry = $registry;
        $this->helper = $helper;
        $this->api = $api;
        $this->order = [];
    }

    /**
     * Execute update order in CRM
     *
     * @param Observer $observer
     *
     * @return mixed
     */
    public function execute(Observer $observer)
    {
        if ($this->registry->registry('RETAILCRM_HISTORY') === true
            || !$this->api->isConfigured()
        ) {
            return false;
        }

        $order = $observer->getEvent()->getOrder();

        if ($order) {
            $this->order = [
                'externalId' => $order->getId(),
                'status' => $this->config->getValue('retailcrm/retailcrm_status/' . $order->getStatus())
            ];

            if ($order->getBaseTotalDue() == 0) {
                if ($this->api->getVersion() == 'v4') {
                    $this->order['paymentStatus'] = 'paid';
                } elseif ($this->api->getVersion() == 'v5') {
                    $payment = [
                        'externalId' => $order->getPayment()->getId(),
                        'status' => 'paid'
                    ];

                    $this->api->ordersPaymentsEdit($payment);
                }
            }

            Helper::filterRecursive($this->order);
            $this->api->setSite($this->helper->getSite($order->getStore()));
            $this->api->ordersEdit($this->order);
        }

        return $this;
    }

    /**
     * @return mixed
     */
    public function getOrder()
    {
        return $this->order;
    }
}