<?php

/**
 * @copyright (C) 2013 iJoomla, Inc. - All rights reserved.
 * @license GNU General Public License, version 2 (http://www.gnu.org/licenses/gpl-2.0.html)
 * @author iJoomla.com <webmaster@ijoomla.com>
 * @url https://www.jomsocial.com/license-agreement
 * The PHP code portions are distributed under the GPL license. If not otherwise stated, all images, manuals, cascading style sheets, and included JavaScript *are NOT GPL, and are released under the IJOOMLA Proprietary Use License v1.0
 * More info at https://www.jomsocial.com/license-agreement
 */

use Joomla\CMS\Component\ComponentHelper;
use Joomla\CMS\Factory;
use Joomla\CMS\Helper\ModuleHelper;
use Joomla\CMS\Language\Text;
use Joomla\CMS\Uri\Uri;

// no direct access
defined('_JEXEC') or die('Restricted access');

jimport('joomla.application.component.view');
jimport('joomla.utilities.arrayhelper');

/**
 * Class exists checking
 */
if (!class_exists('CommunityViewFrontpage')) {

    /**
     * Community frontpage view class
     */
    class CommunityViewFrontpage extends CommunityView {

        /**
         * Frontpage display
         * @param type $tpl
         */
        public function display($tpl = null) {

            /**
             * Init variables
             */
            $config = CFactory::getConfig();
            $document = Factory::getDocument();
            $usersConfig = ComponentHelper::getParams('com_users');
            $my = CFactory::getUser();
            $model = CFactory::getModel('user');

            /**
             * Opengraph
             */
            CHeadHelper::setType('website', Text::sprintf('COM_COMMUNITY_FRONTPAGE_TITLE', $config->get('sitename')));

            /**
             * Init document
             */
            $feedLink = CRoute::_('index.php?option=com_community&view=frontpage&format=feed');
            $feed = '<link rel="alternate" type="application/rss+xml" title="' . Text::_('COM_COMMUNITY_SUBSCRIBE_RECENT_ACTIVITIES_FEED') . '" href="' . $feedLink . '"/>';
            $document->addCustomTag($feed);

            // Process headers HTML output
            $headerHTML = '';
            $tmpl = new CTemplate();
            $alreadyLogin = 0;

            /* User is logged */
            if ($my->id != 0) {
                $headerHTML = $tmpl->fetch('frontpage.members');
                $alreadyLogin = 1;
            } else { /* User is not logged */
                $uri = 'index.php?option=com_community&view=' . $config->get('redirect_login');
                $uri = base64_encode($uri);

                $fbHtml = '';

                /* Facebook login */
                if ($config->get('fbconnectkey') && $config->get('fbconnectsecret') && !$config->get('usejfbc')) {
                    $facebook = new CFacebook();
                    $fbHtml = $facebook->getLoginHTML();
                }

                /* Joomla! Facebook Connect */
                if ($config->get('usejfbc')) {
                    if (class_exists('JFBCFactory')) {
                        $providers = JFBCFactory::getAllProviders();
                        foreach ($providers as $p) {
                            $fbHtml .= $p->loginButton();
                        }
                    }
                }

                $twitterHtml = '';

                /* Twitter login */
                if ($config->get('twitterconnectkey') && $config->get('twitterconnectsecret') && !$config->get('usejfbc')) {
                    $twitter = new CTwitter();
                    $twitterHtml = $twitter->getLoginHTML();
                }

                $linkedinHtml = '';

                /* LinkedIn login */
                if ($config->get('linkedinclientid') && $config->get('linkedinsecret') && !$config->get('usejfbc')) {
                    $linkedin = new CLinkedin();
                    $linkedinHtml = $linkedin->getLoginHTML();
                }

                $googleHtml = '';

                /* Google login */
                if ($config->get('googleclientid') && !$config->get('usejfbc')) {
                    $google = new CGoogle();
                    $googleHtml = $google->getLoginHTML();
                }

                //hero image
                $heroImage = Uri::root() . 'components/com_community/assets/frontpage-image-default.jpg';
                if (file_exists(COMMUNITY_PATH_ASSETS . 'frontpage-image.jpg')) {
                    $heroImage = Uri::root() . 'components/com_community/assets/frontpage-image.jpg';
                } else if (file_exists(COMMUNITY_PATH_ASSETS . 'frontpage-image.png')) {
                    $heroImage = Uri::root() . 'components/com_community/assets/frontpage-image.png';
                }


                //add the hero image as the image metatdata
                $imgMeta='<meta property="og:image" content="'.$heroImage.'"/>';
                $document->addCustomTag($imgMeta);

                $themeModel = CFactory::getModel('theme');
                $settings = $themeModel->getSettings();

                /* Generate header HTML for guest */
                //if($settings['general']['enable-frontpage-login']) {
                    $headerHTML = $tmpl
                        ->set('allowUserRegister', $usersConfig->get('allowUserRegistration'))
                        ->set('inviteOnlyRegister', $config->get('invite_only_request'))
                        ->set('heroImage', $heroImage)
                        ->set('fbHtml', $fbHtml)
                        ->set('twitterHtml', $twitterHtml)
                        ->set('linkedinHtml', $linkedinHtml)
                        ->set('googleHtml', $googleHtml)
                        ->set('useractivation', $usersConfig->get('useractivation'))
                        ->set('return', $uri)
                        ->set('settings', $settings)
                        ->fetch('frontpage/guest');
                // } else {
                //     $headerHTML = '';
                // }
            }

            /* Get site members count */
            $totalMembers = $model->getMembersCount();

            $latestActivitiesData = $this->showLatestActivities();
            $latestActivitiesHTML = $latestActivitiesData['HTML'];

            $tmpl = new CTemplate();
            $tmpl
                    ->set('totalMembers', $totalMembers)
                    ->set('my', $my)
                    ->set('alreadyLogin', $alreadyLogin)
                    ->set('header', $headerHTML)
                    ->set('userActivities', $latestActivitiesHTML)
                    ->set('config', $config)
                    ->set('customActivityHTML', $this->getCustomActivityHTML());

            $status = new CUserStatus();

            if ($my->authorise('community.view', 'frontpage.statusbox')) {
                // Add default status box

                CUserHelper::addDefaultStatusCreator($status);

                if (COwnerHelper::isCommunityAdmin() && $config->get('custom_activity')) {
                    $template = new CTemplate();
                    $template->set('customActivities', CActivityStream::getCustomActivities());

                    $creator = new CUserStatusCreator('custom');
                    $creator->title = Text::_('COM_COMMUNITY_CUSTOM');
                    $creator->html = $template->fetch('status.custom');

                    $status->addCreator($creator);
                }
            }

            /**
             * Misc variables
             * @since 3.3
             * Move out variable init in side template into view
             */
            $moduleCount =  count(ModuleHelper::getModules('js_side_frontpage')) + count(ModuleHelper::getModules('js_side_top')) +
                            count(ModuleHelper::getModules('js_side_bottom')) + count(ModuleHelper::getModules('js_side_frontpage_top')) +
                            count(ModuleHelper::getModules('js_side_frontpage_bottom')) + count(ModuleHelper::getModules('js_side_frontpage_stacked')) +
                            count(ModuleHelper::getModules('js_side_top_stacked')) + count(ModuleHelper::getModules('js_side_bottom_stacked')) +
                            count(ModuleHelper::getModules('js_side_frontpage_top_stacked')) + count(ModuleHelper::getModules('js_side_frontpage_bottom_stacked'));

            $jinput = Factory::getApplication()->input;
            /**
             * @todo 3.3
             * All of these code must be provided in object. DO NOT PUT ANY CODE LOGIC HERE !
             */
            $cconfig = CFactory::getConfig();
            $filter = $jinput->get('filter');
            $filterValue = $jinput->get('value', 'default_value', 'RAW');
            $filterText = Text::_("COM_COMMUNITY_FILTERBAR_ALL");
            $filterHashtag = false;
            $filterKeyword = false;
            if ($filter == 'apps') {
                switch ($filterValue) {
                    case 'profile':
                        $filterText = Text::_("COM_COMMUNITY_FILTERBAR_TYPE_STATUS");
                        break;
                    case 'photo':
                        $filterText = Text::_("COM_COMMUNITY_FILTERBAR_TYPE_PHOTO");
                        break;
                    case 'video':
                        $filterText = Text::_("COM_COMMUNITY_FILTERBAR_TYPE_VIDEO");
                        break;
                     case 'page':
                        $filterText = Text::_("COM_COMMUNITY_FILTERBAR_TYPE_PAGE");
                        break;
                    case 'group':
                        $filterText = Text::_("COM_COMMUNITY_FILTERBAR_TYPE_GROUP");
                        break;
                    case 'event':
                        $filterText = Text::_("COM_COMMUNITY_FILTERBAR_TYPE_EVENT");
                        break;
                    case 'filesharing':
                        $filterText = Text::_("COM_COMMUNITY_FILTERBAR_TYPE_FILE");
                        break;
                    case 'polls':
                        $filterText = Text::_("COM_COMMUNITY_FILTERBAR_TYPE_POLL");
                        break;
                    case 'my-following':
                        $filterText = Text::_("COM_COMMUNITY_FILTERBAR_FOLLOWING");
                        break;
                }
            } else if ($filter == 'hashtag') {
                $filterText = Text::_("COM_COMMUNITY_FILTERBAR_TYPE_HASHTAG") . ' #' . $filterValue;
                $filterHashtag = true;
            } else if ($filter == 'keyword') {
                $filterText = Text::_("COM_COMMUNITY_FILTERBAR_TYPE_KEYWORD") . ' ' . $filterValue;
                $filterKeyword = true;
            } else {
                switch ($filterValue) {
                    case 'me-and-friends':
                        $filterText = Text::_("COM_COMMUNITY_FILTERBAR_RELATIONSHIP_ME_AND_FRIENDS");
                        break;
                }
            }

            echo $tmpl
                    ->set('userstatus', $status)
                    ->set('moduleCount', $moduleCount)
                    ->set('class', ($moduleCount > 0) ? 'span8' : 'span12')
                    ->set('filterKey', $filter)
                    ->set('filter', $filter)
                    ->set('filterText', $filterText)
                    ->set('filterHashtag', $filterHashtag)
                    ->set('filterKeyword', $filterKeyword)
                    ->set('filterValue', $filterValue)
                    ->fetch('frontpage/base');

            $asset = CAssets::getInstance();
            $asset->addData('stream_filter_params', array(
                'filter'  => isset($filter) ? $filter : '',
                'value'   => isset($filterValue) ? $filterValue : '',
                'hashtag' => isset($filterHashtag) ? $filterHashtag : ''
            ));
        }

        /**
         *
         * @return string
         */
        public function getCustomActivityHTML() {
            $tmpl = new CTemplate();
            return $tmpl
                            ->set('isCommunityAdmin', COwnerHelper::isCommunityAdmin())
                            ->set('customActivities', CActivityStream::getCustomActivities())
                            ->fetch('custom.activity');
        }

        /**
         * Get latest activities with HTML to render
         * @return array
         */
        public function showLatestActivities() {
            $config = CFactory::getConfig();
            $my = CFactory::getUser();
            $jinput = Factory::getApplication()->input;

            /* We do store filters into session than we can reuse it under ajax */
            $defaultFilter = $my->_cparams->get('frontpageactivitydefault', $config->get('frontpageactivitydefault'));
            $filter = $jinput->get('filter', '', 'RAW');
            $value = $jinput->get('value','','RAW');

            if ( ( empty($filter) || strpos($filter, ':') !== false ) && $my->id != 0 ) {
                //filter overide, if user has set their own filter, it should rewrite the system default filter
                $myFilter = $my->_cparams->get('frontpageactivitydefault', 'all');
                if($my->id && $myFilter != ''){
                    $filter = $myFilter == 'all' ? $defaultFilter : $myFilter;
                }

                if(!is_array($filter)){
                    //break this filter down if needed
                    $filter = explode(':',$filter);
                }

                if($filter[0] != $defaultFilter){ //prevent unlimited loop if both are set to "all"
                    Factory::getApplication()->redirect(CRoute::_('index.php?option=com_community&view=frontpage&filter=' . $filter[0] . '&value=' . $filter[1], false));
                }
            }
            $userActivities = '';

            /* Filtering */
            switch ($filter) {
                /* Filter by privacy */
                case 'privacy':
                    /* Filter by me and my friends */
                    if ($value == 'me-and-friends' && $my->id != 0) {
                        /**
                         *
                         * @param type $filter
                         * @param type $userId
                         * @param type $view
                         * @param type $showMore
                         */
                        $userActivities = CActivities::getActivitiesByFilter('active-user-and-friends', $my->id, 'frontpage', true);
                    } else {
                        /* No filter. Get all */
                        $userActivities = CActivities::getActivitiesByFilter('all', $my->id, 'frontpage', true);
                    }
                    break;
                /* Filter by type */
                case 'apps':
                    /* By default we use all */
                    $userActivities = CActivities::getActivitiesByFilter('apps', $my->id, 'frontpage', true, array('apps' => array($value)));
                    break;
                /* By default we do filter by privacy and follow backend configured */
                case 'hashtag':
                    //filter by hashtag
                    $userActivities = CActivities::getActivitiesByFilter('hashtag', $my->id, 'frontpage', true, array($filter => $value));
                    break;
                case 'keyword':
                    //filter by keyword
                    $userActivities = CActivities::getActivitiesByFilter('keyword', $my->id, 'frontpage', true, array($filter => $value));
                    break;
                default:
                    $defaultFilter = $config->get('frontpageactivitydefault');
                    /* Filter by me and my friends and of course not for guess */
                    if ($defaultFilter == 'friends' && $my->id != 0) {
                        $userActivities = CActivities::getActivitiesByFilter('active-user-and-friends', $my->id, 'frontpage', true);
                    } else {
                        $userActivities = CActivities::getActivitiesByFilter('all', $my->id, 'frontpage', true, array('show_featured'=>true));
                    }
                    break;
            }

            $activities = array();
            $activities['HTML'] = $userActivities;

            return $activities;
        }

        public function showFeaturedEvents($total = 5) {
            $session = Factory::getSession();
            $html = ''; //$session->get('frontpage_events');
            if (!$html) {


                $tmpl = new CTemplate();
                $frontpage_latest_events = intval($tmpl->params->get('frontpage_latest_events'));
                $html = '';
                $data = array();

                if ($frontpage_latest_events != 0) {
                    $model = CFactory::getModel('Events');
                    $result = $model->getEvents(null, null, null, null, true, false, null, null, CEventHelper::ALL_TYPES, 0, $total);

                    $events = array();
                    $eventView = CFactory::getView('events');
                    $events = $eventView->_getEventsFeaturedList();

                    $tmpl = new CTemplate();
                    $tmpl->set('events', $events);

                    $html = $tmpl->fetch('frontpage.latestevents');
                }
            }
            $session->set('frontpage_events', $html);
            $data['HTML'] = $html;
            return $data;
        }

        public function showFeaturedGroups($total = 5) {
            $tmpl = new CTemplate();
            $config = CFactory::getConfig();
            $showlatestgroups = intval($tmpl->params->get('showlatestgroups'));
            $html = '';
            $data = array();

            if ($showlatestgroups != 0) {
                $groupModel = CFactory::getModel('groups');
                $tmpGroups = $groupModel->getAllGroups(null, null, null, $total);
                $groups = array();

                $data = array();
                $groupView = CFactory::getView('groups');
                $groups = $groupView->getGroupsFeaturedList();

                $tmpl = new CTemplate();
                $html = $tmpl->setRef('groups', $groups)
                        ->fetch('frontpage.latestgroup');
            }

            $data['HTML'] = $html;

            return $data;
        }

        public function getMembersHTML($data) {
            if (empty($data))
                return '';

            $members = array_slice($data['members'], 0, $data['limit']);
            //$limit = $data['limit'];

            $tmpl = new CTemplate();
            echo $tmpl->set('members', $members)
                    ->fetch('frontpage.latestmember.list');
        }

    }

}
