<?php
declare(strict_types=1);

namespace Leadlion\SalesOrder\Controller\Adminhtml\Order;
 
use Magento\Framework\Controller\ResultFactory;
use Magento\Backend\App\Action\Context;
use Leadlion\SalesOrder\Model\Mail\Template\TransportBuilder;
use Magento\Framework\Translate\Inline\StateInterface;
use Magento\Ui\Component\MassAction\Filter;
use Magento\Backend\App\Action;
use Magento\Framework\Exception\LocalizedException;
use Magento\Sales\Model\ResourceModel\Order\CollectionFactory as SalesCollectionFactory;
use Leadlion\SalesOrder\Model\Config;
use Magento\Framework\App\Area;
use Magento\Sales\Model\Order;
use Magento\Framework\Exception\MailException;
use Magento\Backend\Model\View\Result\Redirect;
use Leadlion\AutogedalWarehouses\Model\Warehouse;
use Magento\Framework\Pricing\Helper\Data;
use Magento\Store\Model\StoreManagerInterface;
use SmartBill\Integration\Model\ResourceModel\Invoice\CollectionFactory as InvoiceCollectionFactory;
use Magento\Sales\Api\OrderRepositoryInterface;
use Magento\Framework\Escaper;
use Magento\Framework\Filesystem;

class MassSend extends Action
{
    /**
     * @var Filter
     */
    protected $filter;

    /**
     * @var salesCollectionFactory
     */
    protected $salesCollectionFactory;

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

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

    /**
     * @var StateInterface
     */
    protected $inlineTranslation;

    /**
     * @var Warehouse
     */
    protected $warehouseModel;

    /**
     * @var Data
     */
    protected $priceHelper;

    /**
     * @var Order
     */
    protected $orderModel;

    /**
     * @var StoreManagerInterface
     */
    protected $storeManager;

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

    /**
     * @var OrderRepositoryInterface
     */
    protected $orderRespository;

    /**
     * @var Escaper
     */
    protected $escaper;
    /**
     * @var Filesystem
     */
    private $filesystem;
    /**
     * @var \Leadlion\SalesOrder\Helper\AwbHelper
     */
    private $awbHelper;

    /**
     * @param Context $context
     * @param Filter $filter
     * @param Config $config
     * @param SalesCollectionFactory $salesCollectionFactory
     * @param TransportBuilder $transportBuilder
     * @param StateInterface $inlineTranslation
     * @param Warehouse $warehouseModel
     * @param Order $orderModel
     * @param StoreManagerInterface $storeManager
     * @param InvoiceCollectionFactory $invoiceCollectionFactory
     * @param OrderRepositoryInterface $orderRespository
     * @param Escaper $escaper
     */
    public function __construct(
        Context $context,
        Filter $filter,
        Config $config,
        SalesCollectionFactory $salesCollectionFactory,
        TransportBuilder $transportBuilder,
        StateInterface $inlineTranslation,
        Warehouse $warehouseModel,
        Data $priceHelper,
        Order $orderModel,
        StoreManagerInterface $storeManager,
        InvoiceCollectionFactory $invoiceCollectionFactory,
        OrderRepositoryInterface $orderRespository,
        Escaper $escaper,
        Filesystem $filesystem,
        \Leadlion\SalesOrder\Helper\AwbHelper $awbHelper
    ) {
        $this->filter = $filter;
        $this->config = $config;
        $this->salesCollectionFactory = $salesCollectionFactory;
        $this->transportBuilder = $transportBuilder;
        $this->inlineTranslation = $inlineTranslation;
        $this->warehouseModel = $warehouseModel;
        $this->priceHelper = $priceHelper;
        $this->orderModel = $orderModel;
        $this->storeManager = $storeManager;
        $this->invoiceCollectionFactory = $invoiceCollectionFactory;
        $this->orderRespository = $orderRespository;
        $this->escaper = $escaper;
        parent::__construct($context);
        $this->filesystem = $filesystem;
        $this->awbHelper = $awbHelper;
    }

    /**
     * Execute action
     *
     * @return Redirect
     * @throws LocalizedException
     */
    public function execute()
    {
        $collection = $this->filter->getCollection($this->salesCollectionFactory->create());
        $emailSent = $orderObj = $warehouseId = 0; $orderDetails = [];

        /************* Get the Order Id and Warehouse Email **************/
        foreach ($collection as $items) {
            $warehouseId = $items->getAutogedalAllocatedWarehouse();
            $warehouseObject = $this->warehouseModel->load($warehouseId);
            $supplierEmail = $warehouseObject->getSupplierEmail();
            $orderDetails[$items->getEntityId()] = $supplierEmail;
        }

        /************* Group the Order Ids by Warehouse Email **************/
        $result = [];
        if (count($orderDetails) > 0 && isset($orderDetails)) {
            foreach ($orderDetails as $index => $value) {
                if (!isset($result[$value])) {
                    $result[$value] = $index;
                } else {
                    $result[$value] .= ",$index";
                }
            }
        }

        /************* Send email to Warehouse **************/
        if (count($result) > 0 && isset($result)) {
            foreach ($result as $key => $orderVal) {
                try {
                    $this->send($orderVal, $key);
                    $orderObj = $this->orderRespository->get($orderVal);
                    $orderObj->setStatus(Order::STATE_COMPLETE);
                    $orderObj->setState(Order::STATE_COMPLETE);
                    //TODO change with repository
                    $orderObj->save();
                    $emailSent++;
                } catch (LocalizedException $e) {
                    $this->messageManager->addErrorMessage($e->getMessage());
                    break;
                } catch (\Exception $e) {
                    $this->messageManager->addExceptionMessage($e, __('Some emails were not sent.'));
                    break;
                }
            }
        }

        if ($emailSent) {
            $this->messageManager->addSuccessMessage(__('A total of %1 email(s) have been sent.', $emailSent));
        }

        /** @var Redirect $resultRedirect */
        $resultRedirect = $this->resultFactory->create(ResultFactory::TYPE_REDIRECT);
        return $resultRedirect->setUrl($this->_redirect->getRefererUrl());
    }

    /**
     * @param string $orderIds
     * @return $this
     * @throws LocalizedException
     * @throws MailException
     */
    public function send($orderIds, $email)
    {
        $this->inlineTranslation->suspend();
        $itemData = $sender = []; $storeId = $smartbillObj = $filePath = $fileName = '';
        $orderIds = "$orderIds";
        $orderIdsExp = explode(',', $orderIds);
        $html = '<table class="email-items">';
        foreach($orderIdsExp as $orderId) {
            $orderObj = $this->orderModel->load($orderId);
            $orderIncrementId = $orderObj->getIncrementId();
            $customerName = $orderObj->getCustomerFirstname().' '.$orderObj->getCustomerLastname();
            $storeId = $orderObj->getData('store_id');
            $html .= '<thead><tr class="email-summary" style="display:grid"><th><span>Numarul Comenzii : '.$orderIncrementId.'</span></th>';
            $html .= '<th colspan="2"><span>Numele Clientului : '.$customerName.'</span></th></tr></thead>';
            foreach ($orderObj->getAllVisibleItems() as $item) {
                $html .= '<tr><th>Numele produsului</th><th>Cod produs</th><th>Cantitate</th></tr>';
                $html .= '<tr><td>'.$item->getName().'</td> <td style="text-align:center">'.$item->getSku().'</td> <td style="text-align:center">'.$item->getQtyOrdered() .'</td><tr>';
            }
        }
        $html .= '</table>';

        $sender ['email'] = $this->config->getSenderEmail($storeId);                           
        $sender['name'] = $this->config->getSenderName($storeId);
        $emailTemplate = $this->config->getEmailTemplate($storeId);
        if (!empty($email)) {
            $this->transportBuilder->setTemplateIdentifier(
                'massemaildocument_email_template'
            )->setTemplateOptions(
                [
                    'area' => Area::AREA_FRONTEND,
                    'store' => $storeId,
                ]
            )->setFrom($sender)->setTemplateVars(
                [
                    'html_template' => $html
                ]
            )->addTo($email);
        }
        $varPath = $this->filesystem->getDirectoryRead(\Magento\Framework\App\Filesystem\DirectoryList::VAR_DIR)->getAbsolutePath();
        foreach($orderIdsExp as $orderId) {
            $smartbillObj = $this->invoiceCollectionFactory->create()->getItemByColumnValue('order_id', $orderId);
            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, 'application/pdf');
            }
            $orderObj = $this->orderModel->load($orderId);
            $awbDocFileData = $this->awbHelper->getAwbForOrder($orderObj);
            if($awbDocFileData) {
                $this->transportBuilder->addAttachment(
                    file_get_contents($awbDocFileData["path"]),
                    $awbDocFileData["filename"], 'application/pdf'
                );
            }
        }
        $transport = $this->transportBuilder->getTransport();
        $transport->sendMessage();
        $this->transportBuilder->removeAttachments();
        $this->inlineTranslation->resume();

        return $this;
    }
}

