<?php

/**
 * This Software is the property of Data Development and is protected
 * by copyright law - it is NOT Freeware.
 * Any unauthorized use of this software without a valid license
 * is a violation of the license agreement and will be prosecuted by
 * civil and criminal law.
 * http://www.shopmodule.com
 *
 * @copyright (C) D3 Data Development (Inh. Thomas Dartsch)
 * @author        D3 Data Development - Daniel Seifert <support@shopmodule.com>
 * @link          http://www.oxidmodule.com
 */

namespace D3\MailConfigChecker\Application\Controller\Admin;

use Assert\Assert;
use Assert\InvalidArgumentException;
use D3\MailConfigChecker\Application\Model\Exception\d3TranslatableLazyAssertionException;
use Exception;
use OxidEsales\Eshop\Application\Controller\Admin\AdminDetailsController;
use OxidEsales\Eshop\Application\Model\Shop;
use OxidEsales\Eshop\Core\Email;
use OxidEsales\Eshop\Core\Registry;

class MailConfigCheck extends AdminDetailsController
{
    protected $_sThisTemplate = 'mailConfigCheck.tpl';
    protected $testMailAddress = 'test@example.com';

    public function render()
    {
        $this->checkDataAreSet();
        $this->addTplParam('shop', Registry::getConfig()->getActiveShop());

        return parent::render();
    }

    protected function checkDataAreSet()
    {
        try {
            /** @var Shop $shop */
            $shop = Registry::getConfig()->getActiveShop();
            $lang = Registry::getLang();

            Assert::lazy()
                ->setExceptionClass(d3TranslatableLazyAssertionException::class)
                ->that($shop->getFieldData('oxsmtp'), $lang->translateString('SHOP_MAIN_SMTPSERVER'))
                ->notBlank($lang->translateString('D3_MAILCHECKER_ASSERTIONS_NOTSET'))
                ->regex('/.*:(587|2525)$/m', $lang->translateString('D3_MAILCHECKER_ASSERTIONS_NOPORT'))
                ->that($shop->getFieldData('oxsmtpuser'), $lang->translateString('SHOP_MAIN_SMTPUSER'))
                ->notBlank($lang->translateString('D3_MAILCHECKER_ASSERTIONS_NOTSET'))
                ->that($shop->getFieldData('oxsmtppwd'), $lang->translateString('SHOP_MAIN_SMTPPASSWORD'))
                ->notBlank($lang->translateString('D3_MAILCHECKER_ASSERTIONS_NOTSET'))
                ->that($shop->getFieldData('oxinfoemail'), $lang->translateString('SHOP_MAIN_INFOEMAIL'))
                ->email($lang->translateString('D3_MAILCHECKER_ASSERTIONS_NOTSET'))
                ->that($shop->getFieldData('oxorderemail'), $lang->translateString('SHOP_MAIN_ORDEREMAIL'))
                ->email($lang->translateString('D3_MAILCHECKER_ASSERTIONS_NOTSET'))
                ->that($shop->getFieldData('oxowneremail'), $lang->translateString('SHOP_MAIN_OWNEREMAIL'))
                ->email($lang->translateString('D3_MAILCHECKER_ASSERTIONS_NOTSET'))
                ->verifyNow();
        } catch (InvalidArgumentException $e) {
            Registry::getUtilsView()->addErrorToDisplay(nl2br($e->getMessage()));
        }
    }

    public function checkConfiguration()
    {
        $this->getCurrentMailer();
    }

    protected function getCurrentMailer()
    {
        try {
            $mail = oxNew(Email::class);
            $mail->setRecipient($this->testMailAddress);
            $mail->setBody('.');
            $mail->send();
            $this->addTplParam('mailer', $mail->getMailer());
        } catch (Exception $e) {
            Registry::getUtilsView()->addErrorToDisplay($e);
        }
    }
}