<?php
namespace Mogic\Extname;

use \TYPO3\CMS\Core\Log\LogLevel;
use \TYPO3\CMS\Core\Utility\GeneralUtility;

/**
 * Log all mails sent via the TYPO3 Mailer
 *
 * @author Christian Weiske <weiske@mogic.com>
 */
class MailLogger implements \Swift_Events_SendListener
{
    /**
     * The Mailer class has just been initialized (__construct)
     *
     * @param object $mailer TYPO3 mailer instance
     *
     * @return void
     */
    public function postInitializeMailer(\TYPO3\CMS\Core\Mail\Mailer $mailer)
    {
        $mailer->registerPlugin($this);
    }

    /**
     * Invoked immediately before the Message is sent.
     *
     * @param Swift_Events_SendEvent $evt Event to handle
     *
     * @return void
     */
    public function beforeSendPerformed(\Swift_Events_SendEvent $evt)
    {
    }

    /**
     * Invoked immediately after the Message is sent.
     *
     * @param Swift_Events_SendEvent $evt Event to handle
     *
     * @return void
     */
    public function sendPerformed(\Swift_Events_SendEvent $evt)
    {
        $level = LogLevel::INFO;
        switch ($evt->getResult()) {
        case \Swift_Events_SendEvent::RESULT_PENDING:
            $status = 'pending';
            break;
        case \Swift_Events_SendEvent::RESULT_SPOOLED:
            $status = 'spooled';
            break;
        case \Swift_Events_SendEvent::RESULT_SUCCESS:
            $status = 'success';
            break;
        case \Swift_Events_SendEvent::RESULT_TENTATIVE:
            $status = 'some failures';
            $level = LogLevel::ERROR;
            break;
        case \Swift_Events_SendEvent::RESULT_FAILED:
            $status = 'failed';
            $level = LogLevel::ERROR;
            break;
        }

        $failed = $evt->getFailedRecipients();

        $to = $evt->getMessage()->getTo();

        $message = 'Mail sent:'
            . ' status=' . $status
            . ' to ' . implode(',', array_keys($to));
        if (count($failed)) {
            $message .= ' failed: ' . implode(',', $failed);
        }

        /* @var $logger \TYPO3\CMS\Core\Log\Logger */
        $logger = GeneralUtility::makeInstance('TYPO3\CMS\Core\Log\LogManager')
            ->getLogger(__CLASS__);
        $logger->log($level, $message);
    }
}
?>
