<?php
/**
 * @package     Sven.Bluege
 * @subpackage  com_eventgallery
 *
 * @copyright   Copyright (C) 2005 - 2019 Sven Bluege All rights reserved.
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */
// Check to ensure this file is included in Joomla!
defined('_JEXEC') or die();

jimport( 'joomla.application.component.model' );


//jimport( 'joomla.application.component.helper' );

class EventgalleryModelEvents extends JModelLegacy
{

    var $_total = 0;
    var $_entries = null;
    var $_pagination;

    private $config;
    /**
     * @var JCacheControllerCallback $cache
     */
    protected $cache;

    function __construct()
    {
        parent::__construct();

        $this->config = \Joomla\Component\Eventgallery\Site\Library\Configuration\Main::getInstance();


        $this->cache = JFactory::getCache('com_eventgallery');
        if ($this->config->getGeneral()->doUseCaching()) {
            $this->cache->setCaching(true);
        }

        $app = JFactory::getApplication();

        $limitstart =  $app->input->getInt('limitstart');
        $limit =  $this->config->getEventsList()->getMaxEventsPerPage();
        $this->setState('limit',$limit);
        $this->setState('com_eventgallery.events.limitstart',$limitstart);
    }

    /**
     * This method gets the entries for this model. It uses caching to prevent getting data multiple times.
     *
     * @param boolean $isForNavigation This method can be used to run a search or do do navigation. Doing navigation will result in fields which are populated with _total and _entries. In addition limit and limitstart are taken into account from the state.
     * @param int $limitstart
     * @param int $limit
     * @param array $tags
     * @param string $sortAttribute
     * @param $usergroups
     * @param int $catid the category id to filter the events
     * @param bool $recursive defines if we should get the events for the subcategories too.
     * @param bool $filterByUserGroups defines if we remove user group specific events from list which are invisible for the current user
     * @return array
     */
    function getEntries($isForNavigation, $limitstart=0, $limit=0, $tags = array(), $sortAttribute='ordering', $usergroups = null, $catid = null, $recursive = false, $filterByUserGroups=true)
    {
        if ($isForNavigation) {

            if ($limit == 0) {
                $limit = $this->getState('limit');
            } else {
                $this->setState('limit', $limit);

            }

            if ($limitstart == 0) {
                $limitstart = $this->getState('com_eventgallery.events.limitstart');
            }
        }

        // fix issue with events list where paging was working
        if($limitstart == null || $limitstart <0 ) {
            $limitstart = 0;
        }

        $entries =  $this->cache->get(
            array($this, 'getEntriesUnCached'), array($limitstart, $limit, $tags, $sortAttribute, $usergroups, $catid, $recursive, $filterByUserGroups)
        );

        if ($isForNavigation) {
            $this->_entries = $entries;
            $this->_total = count($entries);
        }
        /*
         * Avoid removing one item from the result if limit is set to -1
         */
        return array_slice($entries, $limitstart, $limit<=0 ? null : $limit);
    }

    /**
     * just get the entries for this model.
     *
     * @param int $limitstart
     * @param int $limit
     * @param array $tags
     * @param string $sortAttribute
     * @param array $usergroups array even if unused we need this for the cache call
     * @param int $catid the category id to filter the events
     * @param bool $recursive defines if we should get the events for the subcategories too.
     * @param bool $filterByUserGroups defines if we remove user group specific events from list which are invisible for the current user
     * @return array
     */
    function getEntriesUnCached(/** @noinspection PhpUnusedParameterInspection */$limitstart=0, $limit=0, $tags = array(), $sortAttribute='ordering', $usergroups = null, $catid = null, $recursive = false, $filterByUserGroups = true)
    {

        $query = $this->_db->getQuery(true)
            ->select('folder.*, count(1) AS '.$this->_db->quoteName('overallCount'))
            ->from($this->_db->quoteName('#__eventgallery_folder') . ' AS folder')
            ->join('', $this->_db->quoteName('#__eventgallery_file') . ' AS file ON folder.folder = file.folder and file.published=1')
            ->where('(file.ismainimageonly IS NULL OR file.ismainimageonly=0)')
            ->where('folder.published=1')
            ->group('folder.id');

        if (null != $catid) {
            $catid = (int)$catid;
            if ($recursive) {
                $options = array();
                $categories = JCategories::getInstance('Eventgallery', $options);

                /**
                 * @var JCategoryNode $currentCategory
                 * @var JCategoryNode $childCategory
                 */

                $currentCategory = $categories->get($catid);
                $conditions = array((int)$catid);

                if ($currentCategory != null) {
                    $childCategories = $currentCategory->getChildren(true);
                    foreach ($childCategories as $childCategory) {
                        array_push($conditions, (int)$childCategory->id);
                    }
                }
                $query->where('catid in ('. implode(',', $conditions) .') ');
            } else {
                $query->where('catid='. $this->_db->quote($catid));
            }
        }

        // Define null and now dates
        $nullDate = $this->_db->quote($this->_db->getNullDate());
        $nowDate  = $this->_db->quote(JFactory::getDate()->toSql());

        $query->where('(folder.publish_up is null OR folder.publish_up = ' . $nullDate . ' OR folder.publish_up <= ' . $nowDate . ')')
              ->where('(folder.publish_down is null OR folder.publish_down = ' . $nullDate . ' OR folder.publish_down >= ' . $nowDate . ')');

        if ($sortAttribute == "date_asc") {
            $query->order('date ASC, ordering DESC');
        } elseif ($sortAttribute == "date_desc") {
            $query->order('date DESC, ordering DESC');
        } elseif ($sortAttribute == "name_asc") {
            $query->order('folder.folder ASC');
        } elseif ($sortAttribute == "name_desc") {
            $query->order('folder.folder DESC');
        } elseif ($sortAttribute == "hits_asc") {
            $query->order('folder.hits ASC');
        } elseif ($sortAttribute == "hits_desc") {
            $query->order('folder.hits DESC');
        } elseif ($sortAttribute == "random") {
            $query->order('RAND()');
        }else {
            $query->order('ordering DESC');
        }

        $entries = $this->_getList($query);


        $newList = Array();
        /**
         * @var EventgalleryLibraryFactoryFolder $folderFactory
         */
        $folderFactory = EventgalleryLibraryFactoryFolder::getInstance();

        foreach ($entries as $entry)
        {
            $entryObject = $folderFactory->getFolder($entry->folder);
            array_push($newList, $entryObject);

        }


        $entries = $newList;

        if (isset($tags) && count($tags)!=0) {

            // remove all non matching entries
            // handle space and comma separated lists like "foo bar" or "foo, bar"


            $finalWinners = Array();

            /**
             * @var EventgalleryLibraryFolder $entry
             */
            foreach($entries as $entry) {
                if (EventgalleryHelpersTags::checkTags($entry->getTags(), $tags) ) {
                    $finalWinners[] = $entry;
                }
            }

            $entries = $finalWinners;
        }

        /**
         * @var EventgalleryLibraryFolder $entry
         */
        // filter by user group
        if ($filterByUserGroups) {
            foreach ($entries as $key => $entry) {
                if (!$entry->isVisible()) {
                    unset($entries[$key]);
                }
            }
        }



        return $entries;

    }

    /**
     * returns the paging bar for the current data set.
     *
     * @return JPagination
     */
    function getPagination()
    {

        $app = JFactory::getApplication();

        if (empty($this->_pagination))
        {

            $total = $this->_total;

            /**
             * @var integer $limit
             */
            $limit      = $this->getState('limit');

            /**
             * @var integer $limitstart
             */
            $limitstart = $this->getState('com_eventgallery.events.limitstart');


            if ($limitstart > $total || $app->input->getInt('limitstart','0')==0) {
                $limitstart=0;
                $this->setState('com_eventgallery.event.limitstart',$limitstart);
            }

            $this->_pagination = new JPagination($total, $limitstart, $limit);
        }

        return $this->_pagination;

    }

}
