/home/edulekha/studygroup.edulekha.com/ow_plugins/questions/classes/enotification_bridge.php
<?php

/**
 * @author Sergey Kambalin <greyexpert@gmail.com>
 * @package questions.classes
 */
class QUESTIONS_CLASS_EnotificationBridge
{
    const ACTION_ANSWER = 'questions-answer';
    const ACTION_POST = 'questions-post';

    /**
     * Singleton instance.
     *
     * @var QUESTIONS_CLASS_NotificationBridge
     */
    private static $classInstance;

    /**
     * Returns an instance of class (singleton pattern implementation).
     *
     * @return QUESTIONS_CLASS_NotificationBridge
     */
    public static function getInstance()
    {
        if ( self::$classInstance === null )
        {
            self::$classInstance = new self();
        }

        return self::$classInstance;
    }

    /**
     *
     * @var QUESTIONS_BOL_Service
     */
    private $service;

    private function __construct()
    {
        $this->service = QUESTIONS_BOL_Service::getInstance();
    }

    public function onAnswerAdd( OW_Event $event )
    {
        $params = $event->getParams();

        $option = $this->service->findOption($params['optionId']);
        $userId = $params['userId'];

        $userService = BOL_UserService::getInstance();

        $question = $this->service->findQuestion($option->questionId);
        $answer = $option->text;
        $answerId = $params['id'];
        $ownerId = $question->userId;

        $questionText = UTIL_String::truncate($question->text, 100, '...');
        $questionUrl = OW::getRouter()->urlForRoute('questions-question', array(
            'qid' => $question->id
        ));

        $notificationParams = array(
            'pluginKey' => QUESTIONS_Plugin::PLUGIN_KEY,
            'action' => self::ACTION_ANSWER,
            'entityType' => 'questions-answer',
            'entityId' => $answerId,
            'userId' => null,
            'time' => time()
        );

        $userAvatars = BOL_AvatarService::getInstance()->getDataForUserAvatars(array($userId));
        $userAvatar = $userAvatars[$userId];

        $uniqId = uniqid('notification_answer');

        $string = array(
            'key' => QUESTIONS_Plugin::PLUGIN_KEY . '+notifications_answer',
            'vars' => array(
                'question' => '<a class="' . $uniqId . '" href="' . $questionUrl . '" >' . $questionText . '</a>',
                'user' => '<a href="' . $userAvatar['url'] . '">' . $userAvatar['title'] . '</a>',
                'answer' => '<a class="' . $uniqId . '" href="' . $questionUrl . '" >' . $answer . '</a>'
            )
        );

        $questionSettings = array(
            'userContext' => array((int) $userId),
            'questionId' => $question->id,
            'relationId' => $question->id
        );

        $notificationData = array(
            'string' => $string,
            'avatar' => $userAvatar,
            'questionSettings' => $questionSettings,
            'uniqId' => $uniqId,
            'url' => $questionUrl
        );

        $follows = $this->service->findFollows($question->id, null, array($userId));

        foreach ( $follows as $f )
        {
            $notificationParams['userId'] = $f->userId;

            $event = new OW_Event('notifications.add', $notificationParams, $notificationData);
            OW::getEventManager()->trigger($event);
        }
    }


    public function onInviteRender( OW_Event $event )
    {
        $params = $event->getParams();

        if ( !in_array($params['entityType'], array('questions-answer', 'questions-post')) )
        {
            return;
        }

        QUESTIONS_Plugin::getInstance()->addStatic(true);

        $data = $params['data'];
        $questionSettings = $data['questionSettings'];
        $uniqId = $data['uniqId'];
        
        $questionSettings["url"] = OW::getRouter()->urlForRoute('questions-question', array(
            'qid' => $questionSettings['questionId']
        ));
        
        $data['url'] = 'javascript:(function() { QUESTIONS.openQuestion({
            questionId: ' . $questionSettings['questionId'] . ',
            relationId: ' . $questionSettings['relationId'] . ',
            userContext: ' . json_encode($questionSettings['userContext']) . ',
            "url": ' . json_encode($questionSettings["url"]) . '
        }); return void(0); })()';

        $event->setData($data);

        $js = UTIL_JsGenerator::newInstance();

        $js->jQueryEvent("." . $uniqId, 'click',
                'QUESTIONS.openQuestion(e.data.questionSettings); return false;',
        array('e'), array(
            'questionSettings' => $questionSettings
        ));

        OW::getDocument()->addOnloadScript($js->generateJs());
    }

    public function onPostAdd( OW_Event $event )
    {
        $params = $event->getParams();

        $userService = BOL_UserService::getInstance();
        $userId = $params['userId'];

        $question = $this->service->findQuestion($params['questionId']);
        $post = UTIL_String::truncate($params['text'], 100, '...');
        $postId = $params['id'];
        $ownerId = $question->userId;

        $questionUrl = OW::getRouter()->urlForRoute('questions-question', array(
            'qid' => $question->id
        ));

        $questionText = UTIL_String::truncate($question->text, 100, '...');

        $notificationParams = array(
            'pluginKey' => QUESTIONS_Plugin::PLUGIN_KEY,
            'action' => self::ACTION_POST,
            'entityType' => 'questions-post',
            'entityId' => $postId,
            'userId' => null,
            'time' => time()
        );

        $uniqId = uniqid('question_post');

        $userAvatars = BOL_AvatarService::getInstance()->getDataForUserAvatars(array($userId));
        $userAvatar = $userAvatars[$userId];

        $string = array(
            'key' => QUESTIONS_Plugin::PLUGIN_KEY . '+notifications_post',
            'vars' => array(
                'question' => '<a class="' . $uniqId . '" href="' . $questionUrl . '" >' . $questionText . '</a>',
                'user' => '<a href="' . $userAvatar['url'] . '">' . $userAvatar['title'] . '</a>',
                'post' => '<a class="' . $uniqId . '" href="' . $questionUrl . '" >' . $post . '</a>'
            )
        );

        $questionSettings = array(
            'userContext' => array((int) $userId),
            'questionId' => $question->id,
            'relationId' => $question->id
        );

        $notificationData = array(
            'string' => $string,
            'avatar' => $userAvatar,
            'questionSettings' => $questionSettings,
            'uniqId' => $uniqId,
            'url' => $questionUrl
        );

        $follows = $this->service->findFollows($question->id, null, array($userId));

        foreach ( $follows as $f )
        {
            $notificationParams['userId'] = $f->userId;

            $event = new OW_Event('notifications.add', $notificationParams, $notificationData);
            OW::getEventManager()->trigger($event);
        }
    }

    public function onCollectActions( BASE_CLASS_EventCollector $e )
    {
        $e->add(array(
            'section' => QUESTIONS_Plugin::PLUGIN_KEY,
            'action' => self::ACTION_ANSWER,
            'sectionIcon' => 'ow_ic_lens',
            'sectionLabel' => OW::getLanguage()->text(QUESTIONS_Plugin::PLUGIN_KEY, 'email_notifications_section_label'),
            'description' => OW::getLanguage()->text(QUESTIONS_Plugin::PLUGIN_KEY, 'email_notifications_setting_answer'),
            'selected' => true
        ));

        $e->add(array(
            'section' => QUESTIONS_Plugin::PLUGIN_KEY,
            'action' => self::ACTION_POST,
            'sectionIcon' => 'ow_ic_lens',
            'sectionLabel' => OW::getLanguage()->text(QUESTIONS_Plugin::PLUGIN_KEY, 'email_notifications_section_label'),
            'description' => OW::getLanguage()->text(QUESTIONS_Plugin::PLUGIN_KEY, 'email_notifications_setting_post'),
            'selected' => true
        ));
    }

    public function init()
    {
        OW::getEventManager()->bind('notifications.on_item_render', array($this, 'onInviteRender'));

        OW::getEventManager()->bind(QUESTIONS_BOL_Service::EVENT_ANSWER_ADDED, array($this, 'onAnswerAdd'));
        OW::getEventManager()->bind(QUESTIONS_BOL_Service::EVENT_POST_ADDED, array($this, 'onPostAdd'));
        OW::getEventManager()->bind('notifications.collect_actions', array($this, 'onCollectActions'));
    }
}