<?php

declare(strict_types=1);

/*
* This file is part of newsmailer bundle for Contao.
*
* (c) Benjamin Roth
*
* @license LGPL-3.0-or-later
*/

namespace vonRotenberg\NewsmailerBundle\EventListener;

use Contao\BackendUser;
use Contao\Config;
use Contao\CoreBundle\ServiceAnnotation\Callback;
use Contao\DataContainer;
use Contao\Message;
use Contao\NewsModel;
use Contao\StringUtil;
use Contao\System;
use NotificationCenter\Model\Notification;

class NewsSendTestmailListener
{
    /**
     * @Callback(table="tl_news", target="fields.nc_testmail.load")
     */
    public function onLoadCallback($varValue, DataContainer $dc)
    {
        return null;
    }

    /**
     * @Callback(table="tl_news", target="fields.nc_testmail.save")
     */
    public function onSaveCallback($varValue, DataContainer $dc)
    {
        if ($varValue && System::getContainer()->get('contao.security.token_checker')->hasBackendUser())
        {
            $News = NewsModel::findByPk($dc->id);
            $User = BackendUser::getInstance();
            list($admin_name,$admin_email) = StringUtil::splitFriendlyEmail(Config::get('adminEmail'));

            if ($News !== null && ($Archive = $News->getRelated('pid')) !== null && ($Notification = Notification::findByPk($Archive->nc_notification)) !== null)
            {
                $arrRow = array(
                    'date' => date('d.m.Y',$News->date),
                    'headline' => $News->headline,
                    'teaser' => \Contao\StringUtil::substr(strip_tags(str_ireplace(array('<br />','<br>','<br/>','</p>','<p>'),' ',$News->teaser)),128)
                );

                if (($objJumpTo = $Archive->getRelated('jumpTo')) !== null)
                {
                    $arrRow['url'] = $objJumpTo->getAbsoluteUrl(sprintf((Config::get('useAutoItem') ? '/%s' : '/items/%s'),$News->alias)).'?ltoken=%%_TOKEN_%%';
                }

                $arrNewsPlain[] = date('d.m.Y',$News->date).' - '.$News->headline;
                $arrNewsHtml[] = '<div style="margin-bottom: 15px;"><h3>'.$arrRow['date'].' '.$arrRow['headline'].'</h3><p>'.$arrRow['teaser'].'</p>'. ($arrRow['url'] ? '<p><a href="'.$arrRow['url'].'">&raquo; Ganze Nachricht lesen...</a></p>' : '') .'</div>';

                // User
                $strEmail = $User->email;
                if (($Member = \MemberModel::findActiveByEmailAndUsername($strEmail)) !== null)
                {
                    $strLastname = $Member->firstname;
                    $strFirstname = $Member->lastname;
                    if ($Member->nc_news_additionalEmail)
                    {
                        $strEmail .= ','.$Member->nc_news_additionalEmail;
                    }
//                    $strToken = \TokenLogin::getOrRenewUserToken($Member);
                    $strToken = '';
                } else {
                    $arrSplitName = explode(" ", $User->name);
                    $strLastname = array_pop($arrSplitName);
                    $strFirstname = implode(" ", $arrSplitName);
                    $strToken = '';
                }

                if ($Notification->send(array
                (
                    'member_email'      => $strEmail,
                    'member_firstname' => $strFirstname,
                    'member_lastname' => $strLastname,
                    'news_topics'       => implode("\n",$arrNewsPlain),
                    'news_topics_html'  => "<ul>\n<li>".str_replace('%%_TOKEN_%%',$strToken,implode("</li>\n<li>",$arrNewsHtml))."</li>\n</ul>",
                    'member_login_token'  => $strToken,
                    'admin_email'  => $admin_email,
                ),
                    $GLOBALS['TL_LANGUAGE']))
                {
                    Message::addConfirmation(sprintf($GLOBALS['TL_LANG']['tl_news']['MSC']['nc_news_testletter'],$strEmail));
                } else {
                    Message::addError($GLOBALS['TL_LANG']['tl_news']['MSC']['nc_news_testletter_error']);
                }

            }
        }

        return null;
    }
}