<?php

namespace Leadlion\SalesOrder\Observer;

use Magento\Framework\Event\ObserverInterface;
use Magento\Framework\Event\Observer;
use Magento\Sales\Model\Order;
use Leadlion\SalesOrder\Model\Mail\Template\TransportBuilder;
use Magento\Framework\App\Area;
use Leadlion\SalesOrder\Model\Config;
use Psr\Log\LoggerInterface;
use Magento\Payment\Helper\Data;
use Magento\Store\Model\ScopeInterface;
use Magento\Framework\App\Config\ScopeConfigInterface;
use Magento\Sales\Model\Order\Address\Renderer;
use Eadesigndev\Awb\Helper\TrackingUrl;
use SmartBill\Integration\Model\ResourceModel\Invoice\CollectionFactory as InvoiceCollectionFactory;
use Magento\Framework\Filesystem;
use Magento\Sales\Model\Order\Status\HistoryFactory;

class OrderSaveAfter implements ObserverInterface
{
    const EMAIL_TEMPLATE = 'orderflow/order_complete/template';

    /**
     * @var TransportBuilder
     */
    protected $transportBuilder;

    /**
     * @var Config
     */
    protected $config;

    /**
     * @var \Magento\Payment\Helper\Data
     */
    private $paymentHelper;
    
    /**
     * @var LoggerInterface
     */
    private $logger;

    /**
     * Store config
     *
     * @var ScopeConfigInterface
     */
    private $scopeConfig;

    /**
     * @var Renderer
     */
    protected $addressRenderer;

    /**
     * @var TrackingUrl
     */
    protected $trackingUrl;

    /**
     * @var Filesystem
     */
    private $filesystem;

    /**
     * @var InvoiceCollectionFactory
     */
    private $invoiceCollectionFactory;

    /**
     * @var HistoryFactory
     */
    protected $orderHistoryFactory;

    public function __construct(
        TransportBuilder $transportBuilder,
        Config $config,
        LoggerInterface $logger,
        Data $paymentHelper,
        ScopeConfigInterface $scopeConfig,
        Renderer $addressRenderer,
        TrackingUrl $trackingUrl,
        Filesystem $filesystem,
        InvoiceCollectionFactory $invoiceCollectionFactory,
        HistoryFactory $orderHistoryFactory
    ) {
        $this->transportBuilder = $transportBuilder;
        $this->config = $config;
        $this->logger = $logger;
        $this->paymentHelper = $paymentHelper;
        $this->scopeConfig = $scopeConfig;
        $this->addressRenderer = $addressRenderer;
        $this->trackingUrl = $trackingUrl;
        $this->filesystem = $filesystem;
        $this->invoiceCollectionFactory = $invoiceCollectionFactory;
        $this->orderHistoryFactory = $orderHistoryFactory;
    }

    public function execute(Observer $observer)
    {
        $order = $observer->getEvent()->getOrder();
        $origStateData = $order->getOrigData('state');
        if ($origStateData != $order->getState() &&
            $order->getState() === Order::STATE_COMPLETE
        ) {
            $storeId = $order->getStoreId();

            $sender ['email'] = $this->config->getSenderEmail($storeId);
            $sender['name'] = $this->config->getSenderName($storeId);

            $email = $order->getCustomerEmail();
            $this->transportBuilder->setTemplateIdentifier(
                $this->getConfigValue(self::EMAIL_TEMPLATE, $storeId)
            )->setTemplateOptions(
                [
                    'area' => Area::AREA_FRONTEND,
                    'store' => $storeId,
                ]
            )->setFrom($sender)->setTemplateVars(
                $this->getTemplateVars($order)
            )->addTo($email);

            $varPath = $this->filesystem->getDirectoryRead(
                \Magento\Framework\App\Filesystem\DirectoryList::VAR_DIR
            )->getAbsolutePath();

            $smartbillObj = $this->invoiceCollectionFactory->create()->getItemByColumnValue('order_id', $order->getId());
            if (isset($smartbillObj)) {
                $documentUrl = $smartbillObj->getData('smartbill_document_url');
                $docRelPath = ltrim($documentUrl, '/');
                $filePath = $varPath . dirname($docRelPath);
                $fileName = basename($documentUrl);
            }
            if (!empty($fileName)) {
                $this->transportBuilder->addAttachment(
                    file_get_contents("$filePath/$fileName"),
                    $fileName
                );
            }

            try {
                $transport = $this->transportBuilder->getTransport();
                $transport->sendMessage();
            } catch (\Exception $e) {
                $this->logger->critical($e->getMessage());
            }
        }

        if ($origStateData != $order->getState() &&
            $order->getState() === Order::STATE_CANCELED
        ) {
            $comment = "Comanda a fost anulata";

            $history = $this->orderHistoryFactory->create()
                ->setStatus('canceled')
                ->setEntityName(\Magento\Sales\Model\Order::ENTITY)
                ->setComment(
                    $comment
                );

            $history->setIsCustomerNotified(false)->setIsVisibleOnFront(false);
            $order->addStatusHistory($history);
        }
    }

    protected function getConfigValue($path, $storeId)
    {
        return $this->scopeConfig->getValue(
            $path,
            \Magento\Store\Model\ScopeInterface::SCOPE_STORE,
            $storeId
        );
    }

    private function getTemplateVars($order)
    {
        $payment = $order->getPayment();
        $method = $payment->getMethodInstance();
        $methodTitle = $method->getTitle();
        $carrierId = $order->getCarrierId();
        $awbNumber = $order->getAwbNumber();

        $trackingUrl = $this->trackingUrl->getTrackingUrl($carrierId, $awbNumber);
        $billingAddress = $order->getBillingAddress();

        return [
            'awbNumber' => $awbNumber,
            'trackingUrl' => $trackingUrl,
            'carrierName' => $order->getCarrierName(),
            'order' => $order,
            'order_data' => [
                'customer_name' => $billingAddress->getFirstname().' '.$billingAddress->getLastname()
            ],
            'payment_html' => $this->getPaymentHtml($order),
            'store' => $order->getStore(),
            'paymentMethod' => $methodTitle,
            'formattedShippingAddress' => $this->getFormattedShippingAddress($order),
            'formattedBillingAddress' => $this->getFormattedBillingAddress($order)
        ];
    }

    private function getPaymentHtml(\Magento\Sales\Api\Data\OrderInterface $order)
    {
        return $this->paymentHelper->getInfoBlockHtml(
            $order->getPayment(),
            $order->getStoreId()
        );
    }

    protected function getFormattedShippingAddress($order)
    {
        return $order->getIsVirtual()
            ? null
            : $this->addressRenderer->format($order->getShippingAddress(), 'html');
    }

    protected function getFormattedBillingAddress($order)
    {
        return $this->addressRenderer->format($order->getBillingAddress(), 'html');
    }
}
