<?php
/**
 * Виджет голосования
 */

class VotesWidget extends CWidget
{
    /**
     * @var vote_id - какое голосование показывать; если null то показывается самое последнее разрешённое к показу
     */
    public $vote_id = null;

    public function init()
    {
    }

    public function run()
    {
        $poll = null;
        $not_from_cache = false;

        if( empty($this->vote_id) )
        {
            $CACHE_KEY = Yii::app()->cache->buildKey(
                keysSet::CACHE_KEY_POLLS_WIDGET,
                array()
            );

            $poll = Yii::app()->cache->get($CACHE_KEY);

            if($poll === false)
            {
                //Если не задано какой конкретно опрос брать, берём самый свежиый, достпный для показа
                $criteria = new CDbCriteria;
                $criteria->order = "id DESC";
                $criteria->limit = 1;

                $poll = Votes::model()->
                    with(array(
                        'items',
                        'users_voted_count',
                        'voices_count',
                    ))->
                    visible()->
                    find($criteria);

                $not_from_cache = true;
            }
        }
        else{
            $CACHE_KEY = Yii::app()->cache->buildKey(
                keysSet::CACHE_KEY_POLLS_WIDGET,
                array($this->vote_id)
            );

            $poll = Yii::app()->cache->get($CACHE_KEY);

            if($poll === false)
            {
                //Если задано какой конкретно опрос брать, берём его
                $poll = Votes::model()->
                    with(array(
                        'items',
                        'users_voted_count',
                        'voices_count',
                    ))->
                    visible()->
                    FindByPk($this->vote_id);

                $not_from_cache = true;
            }
        }

        if( $not_from_cache )
        {
            $TTL = iMemCache::CACHE_DURATION_1_DAY;

            if( empty($poll) )
            {
                $TTL = Votes::model()->correctCacheTime(iMemCache::CACHE_DURATION_1_DAY, "active=1");
            }
            else{
                $TTL = Votes::model()->correctCacheTime(iMemCache::CACHE_DURATION_1_DAY, "active=1 AND id={$poll->id}");
            }

            Yii::app()->cache->set($CACHE_KEY, $poll, $TTL);

            if( empty($poll) )
            {
                Yii::app()->cache->addDependency($CACHE_KEY, array(
                        //Сбрасываем кеш, когда какой-то опрос изменяется из админки или добавляется новый активный опрос
                        'Votes@isActive' => array(),
                    )
                );
            }
            else
            {
                Yii::app()->cache->addDependency($CACHE_KEY, array(
                        //Сбрасываем кеш, если кто-то ещё проголосовал в этом опросе
                        "VotesVoices@pollIs({$poll->id})" => array(),
                        //Сбрасываем кеш, если из админки отредактировали варианты ответов, входящие в этот тест
                        "VotesItems@pollIs({$poll->id})" => array(),
                        //Сбрасываем кеш, когда данный опрос изменяется из админки или добавляется новый активный опрос
                        '>Votes@isActive' => array($poll->id),
                    )
                );
            }
        }

        if( !empty($poll) )
        {
            //Условие показа опроса:
            //Если пользователь может голосовать(ещё не голосовал)
            //или если есть ограничение голосования по IP, но не стоит кука, что он уже голосовал,
            //тогда покажем опрос, а иначе результаты гослования.
            //Если стоит ограничение по голосованию с этого IP, то покажем голосование, но при попытке
            //проголосовать будет выводиться предупреждение, что голосовать с этого IP пока нельзя, надо ждать минуту.
            $show_poll_to_vote =
                $poll->Can_I_Vote() ||
                ($poll->is_ip_restricted() && !isset(Yii::app()->request->cookies[Votes::getCookieKey($poll->id)]));

            $this->render('application.widgets.polls.views.votes', array('poll' => $poll, 'show_poll_to_vote' => $show_poll_to_vote));
        }
    }
}