<?php
/**
 * JEvents Component for Joomla! 3.x
 *
 * @version     $Id: defaults.php 3308 2012-02-28 10:13:19Z geraintedwards $
 * @package     JEvents
 * @copyright   Copyright (C) 2008-2018 GWE Systems Ltd
 * @license     GNU/GPLv2, see http://www.gnu.org/licenses/gpl-2.0.html
 * @link        http://www.jevents.net
 */

defined( 'JPATH_BASE' ) or die( 'Direct Access to this location is not allowed.' );

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

class AdminDefaultsController extends JControllerForm {
	/**
	 * Controler for the Control Panel
	 * @param array		configuration
	 */
	function __construct($config = array())
	{
		parent::__construct($config);
		
		if (!JEVHelper::isAdminUser())
		{
			JFactory::getApplication()->redirect("index.php?option=" . JEV_COM_COMPONENT . "&task=cpanel.cpanel", "Not Authorised - must be admin");
			return;
		}
		
		$this->registerTask( 'list',  'overview' );
		$this->registerTask( 'new',  'edit' );
		$this->registerTask( 'save',  'apply' );
		$this->registerDefaultTask("overview");

		// Make sure DB is up to date
		$db = JFactory::getDbo();
		$db->setQuery("SELECT * FROM #__jev_defaults");
		$defaults =$db->loadObjectList("name");
		if (!isset($defaults['icalevent.detail_body'])){
			$db->setQuery("INSERT INTO  #__jev_defaults set name='icalevent.detail_body',
						title=".$db->Quote("JEV_EVENT_DETAIL_PAGE").",
						subject='',
						value='',
						state=0");
			$db->execute();
		}
		else {
			$db->setQuery("UPDATE #__jev_defaults set title=".$db->Quote("JEV_EVENT_DETAIL_PAGE")." WHERE name='icalevent.detail_body'");
			$db->execute();
		}

		if (!isset($defaults['icalevent.edit_page'])){
			$db->setQuery("INSERT INTO  #__jev_defaults set name='icalevent.edit_page',
						title=".$db->Quote("JEV_EVENT_EDIT_PAGE").",
						subject='',
						value='',
						state=0");
			$db->execute();
		}
		else {
			$db->setQuery("UPDATE #__jev_defaults set title=".$db->Quote("JEV_EVENT_EDIT_PAGE")." WHERE name='icalevent.edit_page'");
			$db->execute();
		}
		
		if (!isset($defaults['icalevent.list_row'])){
			$db->setQuery("INSERT INTO  #__jev_defaults set name='icalevent.list_row',
						title=".$db->Quote("JEV_EVENT_LIST_ROW").",
						subject='',
						value='',
						state=0");
			$db->execute();
		}
		else {
			$db->setQuery("UPDATE #__jev_defaults set title=".$db->Quote("JEV_EVENT_LIST_ROW")." WHERE name='icalevent.list_row'");
			$db->execute();
		}
		
		if (!isset($defaults['month.calendar_cell'])){
			$db->setQuery("INSERT INTO  #__jev_defaults set name='month.calendar_cell',
						title=".$db->Quote("JEV_EVENT_MONTH_CALENDAR_CELL").",
						subject='',
						value='',
						state=0");
			$db->execute();
		}
		else {
			$db->setQuery("UPDATE #__jev_defaults set title=".$db->Quote("JEV_EVENT_MONTH_CALENDAR_CELL")." WHERE name='month.calendar_cell'");
			$db->execute();
		}
		
		if (!isset($defaults['month.calendar_tip'])){
			$db->setQuery("INSERT INTO  #__jev_defaults set name='month.calendar_tip',
						title=".$db->Quote("JEV_EVENT_MONTH_CALENDAR_TIP").",
						subject='',
						value='',
						state=0");
			$db->execute();
		}
		else {
			$db->setQuery("UPDATE #__jev_defaults set title=".$db->Quote("JEV_EVENT_MONTH_CALENDAR_TIP")." WHERE name='month.calendar_tip'");
			$db->execute();
		}
		
/*
 * Edit Page config must wait for plugins to be updated!
		if (!isset($defaults['icalevent.edit_page'])){
			$db->setQuery("INSERT INTO  #__jev_defaults set name='icalevent.edit_page',
						title=".$db->Quote(JText::_("JEV_EVENT_EDIT_PAGE")).",
						subject='',
						value='',
						state=0");
			$db->execute();
		}
		else {
			$db->setQuery("UPDATE #__jev_defaults set title=".$db->Quote(JText::_("JEV_EVENT_EDIT_PAGE"))." WHERE name='icalevent.edit_page'");
			$db->execute();
		}
*/

	}

	/**
	 * List Ical Events
	 *
	 */
	function overview( )
	{
		$this->populateLanguages();
		$this->populateCategories();
		
		// get the view
		$this->view = $this->getView("defaults","html");

		// Set the layout
		$this->view->setLayout('overview');

		// Get/Create the model
		if ($model =  $this->getModel("defaults", "defaultsModel")) {
			// Push the model into the view (as default)
			$this->view->setModel($model, true);
		}

		$this->view->overview();
	}

	function edit($key = NULL, $urlVar = NULL){
		// get the view
		$this->view = $this->getView("defaults","html");

		// Set the layout
		$this->view->setLayout('edit');

		// Get/Create the model
		if ($model =  $this->getModel("default", "defaultsModel")) {
			// Push the model into the view (as default)
			$this->view->setModel($model, true);
		}

		$this->view->edit();

	} // editdefaults()

	function cancel($key = NULL){
		$this->setRedirect(JRoute::_("index.php?option=".JEV_COM_COMPONENT."&task=defaults.overview",false) );
		$this->redirect();
	}

	function unpublish(){
		$jinput = JFactory::getApplication()->input;

		$db= JFactory::getDbo();
		$cid = $jinput->get("cid", array(), "array");
		if (count($cid)!=1) {
			$this->setRedirect(JRoute::_("index.php?option=".JEV_COM_COMPONENT."&task=defaults.overview",false) );
			$this->redirect();
			return;
		}
		$name = $cid[0];
		$sql = "UPDATE #__jev_defaults SET state=0 where id=".$db->Quote($name);
		$db->setQuery($sql);
		$db->execute();

		$this->setRedirect(JRoute::_("index.php?option=".JEV_COM_COMPONENT."&task=defaults.overview",false) );
		$this->redirect();
	}

	function publish(){
		$db= JFactory::getDbo();
		$jinput = JFactory::getApplication()->input;

		$cid = $jinput->get("cid",array(), "array");
		if (count($cid)!=1) {
			$this->setRedirect(JRoute::_("index.php?option=".JEV_COM_COMPONENT."&task=defaults.overview",false) );
			$this->redirect();
			return;
		}
		$name = $cid[0];

		// Check if the layout is the same as the default value - if it is then do NOT publish it
		$sql = "SELECT * FROM #__jev_defaults where id=".$db->Quote($name);
		$db->setQuery($sql);
		$value = $db->loadObject();

		$defaultvalue = "";
		$componentname = explode(".",$value->name ,2);
		$componentname =  $componentname[0];

		if (JevJoomlaVersion::isCompatible("3.0.0"))
		{
			if ($defaultvalue == "" && file_exists(JPATH_ADMINISTRATOR . '/components/'.  $componentname   .'/views/defaults/tmpl/' . $value->name . ".3.html"))
			{
				$defaultvalue = file_get_contents(JPATH_ADMINISTRATOR . '/components/'.  $componentname   .'/views/defaults/tmpl/' . $value->name . ".3.html");
			}
		}
		if ($defaultvalue == "" && file_exists(JPATH_ADMINISTRATOR . '/components/'.  $componentname   .'/views/defaults/tmpl/' . $value->name . ".html"))
		{
			$defaultvalue = file_get_contents(JPATH_ADMINISTRATOR . '/components/'.  $componentname   .'/views/defaults/tmpl/' . $value->name . ".html");
		}

		if (str_replace(" ", "",$defaultvalue)==str_replace(" ","",$value->value) || $value->value=="") {
			JFactory::getApplication()->enqueueMessage(JText::_("JEV_LAYOUT_IS_DEFAULT_NOT_PUBLISHED", "WARNING"));
			$this->setRedirect(JRoute::_("index.php?option=".JEV_COM_COMPONENT."&task=defaults.overview",false) );
			$this->redirect();
			return;
		}
		
		$sql = "UPDATE #__jev_defaults SET state=1 where id=".$db->Quote($name);
		$db->setQuery($sql);
		$db->execute();

		$this->setRedirect(JRoute::_("index.php?option=".JEV_COM_COMPONENT."&task=defaults.overview",false) );
		$this->redirect();
	}


	/**
	* Saves the Session Record
	*/
	function save($key = NULL, $urlVar = NULL) {

		$jinput = JFactory::getApplication()->input;

		$id = $jinput->getInt("id",0);
		if ($id >0 ){

			// Get/Create the model
			if ($model =  $this->getModel("default", "defaultsModel")) {
				//TODO find a work around for getting post array with JInput.
				if ($model->store(JRequest::get("post",JREQUEST_ALLOWRAW))){
					if ($jinput->getCmd("task") == "defaults.apply"){
						$this->setRedirect("index.php?option=".JEV_COM_COMPONENT."&task=defaults.edit&id=$id",JText::_("JEV_TEMPLATE_SAVED"));
						$this->redirect();
						return;
					}					
					$this->setRedirect("index.php?option=".JEV_COM_COMPONENT."&task=defaults.overview",JText::_("JEV_TEMPLATE_SAVED"));
					$this->redirect();
					return;
				}
				else {
					echo "<script> alert('".$model->getErrorMessage()."'); window.history.go(-1); </script>\n";
					exit();
				}
			}
		}


	}

	private function populateLanguages() {
		$db = JFactory::getDbo();
			
		// get the list of languages first 
		$query	= $db->getQuery(true);
		$query->select("l.*");
		$query->from("#__languages as l");
		$query->where('l.lang_code <> "xx-XX"');
		$query->order("l.lang_code asc");
		
		$db->setQuery($query);
		$languages  = $db->loadObjectList('lang_code');
		
		// remove ones where the language is no longer installed
		$query	= $db->getQuery(true);
		$langcodes = array();
		$langcodes[] = $db->quote("*");
		foreach ($languages as $lang){
			$langcodes[] = $db->quote($lang->lang_code);
		}
		$langcodes =  implode(",",$langcodes);
		$query->delete('#__jev_defaults')->where("language NOT IN ($langcodes)");
		$db->setQuery($query);
		$db->execute();
		
		// not needed if only one language
		if (count($languages )==1){
			return;
		}
                
                // Clean up bad data                
		$query	= $db->getQuery(true);
                $query->select("count(id) as duplicatecount, name, language, catid");
                $query->from("#__jev_defaults as def");
                $query->group("name, language, catid");
                $query->having("duplicatecount > 1");
		$db->setQuery($query);
                $xxx = (string) $db->getQuery();
		$duplicates = $db->loadObjectList();
                
                if ( count($duplicates)) {
                    foreach ($duplicates as $duplicate)
                    {
                        $query	= $db->getQuery(true);
                        $query->select("id, state, name, language, value");
                        $query->from("#__jev_defaults as def");
                        $query->where('def.name ='.$db->quote($duplicate->name));
                        $query->where('def.catid ='.$db->quote($duplicate->catid));
                        $query->where('def.language ='.$db->quote($duplicate->language));
                        $query->order("name, language, state desc, id desc");
                        $db->setQuery($query);
                        $duplicatedetails = $db->loadObjectList();
                        if (count($duplicatedetails)==$duplicate->duplicatecount){
                            // Keep the most up to date published entry
                            if ($duplicatedetails[0]->state==1) {
                                $dupids = array();
                                for ($d=1; $d<$duplicate->duplicatecount; $d++) {
                                    $dupids[] = $duplicatedetails[$d]->id;
                                }
                                if (count($dupids)>0) {
                                    $query = $db->getQuery(true);
                                    $query->delete("#__jev_defaults");
                                    $query->where("id in (".implode(",", $dupids).")");
                                    $db->setQuery($query);
                                    //var_dump($duplicate);
                                    //echo "<hr/>";
                                    //echo (string) $db->getQuery();exit();
                                    $db->execute();
                                }
                            }
                            else {
                                // sort by descending value
                                usort($duplicatedetails, function($a, $b){ return -1 * strcmp($a->value, $b->value);});
                                $dupids = array();
                                for ($d=1; $d<$duplicate->duplicatecount; $d++) {                                    
                                    $dupids[] = $duplicatedetails[$d]->id;
                                }
                                if (count($dupids)>0) {
                                    $query = $db->getQuery(true);
                                    $query->delete("#__jev_defaults");
                                    $query->where("id in (".implode(",", $dupids).")");
                                    $db->setQuery($query);
                                    //var_dump($duplicate);
                                    //echo "<hr/>";
                                    //echo (string) $db->getQuery();exit();
                                    $db->execute();
                                }
                            }
                        }
                    }
                }

		$query	= $db->getQuery(true);
		$query->select("def.*");
		$query->from("#__jev_defaults as def");
			
		$query->where('def.language = "*"');
		
		$query->order("def.title asc");
		$db->setQuery($query);
		$allLanguageTitles = $db->loadObjectList();
		
		$query	= $db->getQuery(true);
		$query->select("def.*");
		$query->from("#__jev_defaults as def");
			
		$query->where('def.language <> "*"');
		
		$query->order("def.title, language asc");
		
		$db->setQuery($query);
		$specificLanguageTitles = $db->loadObjectList();

		$missingDefaults = array();
		foreach ($allLanguageTitles as $title){
			foreach ($languages  as $lang_code=>$lang){
				$matched = false;
				foreach ($specificLanguageTitles as $stitle){
					if ($title->name == $stitle->name && $stitle->language == $lang_code){
						$matched = true;
						break;
					}
				}
				if (!$matched){
					$missingDefaults[] = array("lang_code"=>$lang_code, "title"=>$title);
				}
			}
		}
		
		if (count ($missingDefaults)>0){
			$query	= $db->getQuery(true);
			$query->insert("#__jev_defaults")->columns("title, name, subject,value,state,params,language");
			foreach ($missingDefaults as $md){
				$values = array($db->quote($md["title"]->title), $db->quote($md["title"]->name), $db->quote($md["title"]->subject), $db->quote($md["title"]->value), 0, $db->quote($md["title"]->params), $db->quote($md["lang_code"]));
				$query->values(implode(",",$values));
			}
			$db->setQuery($query);
			$db->execute();
		}
		
		//echo $db->getgetErrorMsg();
	
	}

	private function populateCategories() {
		$db = JFactory::getDbo();

		// get the list of categories first
		$query	= $db->getQuery(true);
		$query->select("c.*");
		$query->from("#__categories as c");
		$query->where('extension="com_jevents"');
		$query->where('published=1');
		$query->order("c.title asc");

		$db->setQuery($query);
		$categories  = $db->loadObjectList('id');

		// remove ones where the category is no longer installed
		$query	= $db->getQuery(true);
		$cats = array();
		$cats[0] = $db->quote("0");
		foreach ($categories as $cat){
			$cats[$cat->id] = $db->quote($cat->id);
		}
		$incats =  implode(",",$cats);
		$query->delete('#__jev_defaults')->where("catid NOT IN ($incats)");
		$db->setQuery($query);
		$db->execute();

		// not needed if only one category
		if (count($cats )==1){
			return;
		}
		$query	= $db->getQuery(true);
		$query->select("def.*");
		$query->from("#__jev_defaults as def");

		//$query->where('def.language = "*"');
		$query->where('def.catid = "0"');
		$query->where('def.name NOT like ("com_jevpeople%") AND def.name NOT like ("com_jevlocations%")' );
		$query->order("def.name asc");
		$db->setQuery($query);
		$tempdata = $db->loadObjectList();
		$allCatidNames = array();
		foreach ($tempdata as $td){
			if (!isset($allCatidNames[$td->name])){
				$allCatidNames[$td->name] = array();
			}
			$allCatidNames[$td->name][] = $td;
		}

		$query	= $db->getQuery(true);
		$query->select("def.*");
		$query->from("#__jev_defaults as def");

		$query->where('def.catid<> "0"');
		$query->where('def.name NOT like ("com_jevpeople%") AND def.name NOT like ("com_jevlocations%")' );
		$query->order("def.name, catid asc");

		$db->setQuery($query);
		$catdata = $db->loadObjectList();
		$specificCategoryNames = array();
		foreach ($catdata as $cat){
			if (!isset($specificCategoryNames[$cat->name])){
				$specificCategoryNames[$cat->name] = array();
			}
			$specificCategoryNames[$cat->name][$cat->catid.".".$cat->language] = $cat;
		}

		$missingDefaults = array();
		foreach ($allCatidNames as $name => $namedata){
			// all language versions to check and populate
			if (!isset($specificCategoryNames[$name])) {
				foreach ($cats  as $catid=>$cat){
					if ($catid==0) continue;
					foreach ($namedata as $nd){
						$missingDefaults[] = array("catid"=>$catid, "lang_code"=>$nd->language, "name"=>$nd);
						//echo $nd->name." ".$catid." ".$nd->language."<Br/>";
					}
				}
			}
			else {
				foreach ($namedata as $nd){
					foreach ($cats  as $catid=>$cat){
						if ($catid==0) continue;
						$matched = false;
						foreach ($specificCategoryNames[$name] as $sname){
							if ($nd->name == $sname->name && $nd->language == $sname->language && $sname->catid == $catid){
								$matched = true;
								break;
							}
						}
						if (!$matched){
							$missingDefaults[] = array("catid"=>$catid, "lang_code"=>$nd->language, "name"=>$nd);
							//echo $nd->name." ".$catid." ".$nd->language."<Br/>";
						}
					}
				}

			}
		
			/*
					foreach ($namedata as $allcat){
						if ( $catid == $sname->catid){
							$matched = false;
							foreach ($specificCategoryNames as $sname){
								if ($name->name == $sname->name && $name->language == $sname->language ){
									$matched = true;
									$count++;
									break;
								}
							}
							if (!$matched){
								$missingDefaults[] = array("catid"=>$catid, "lang_code"=>$name->language, "name"=>$name);
							}
						}
					}
				}
			*/
		}

		if (count ($missingDefaults)>0){
			$query	= $db->getQuery(true);
			$query->insert("#__jev_defaults")->columns("title, name, subject,value,state,params,language, catid");
			foreach ($missingDefaults as $md){
				$values = array($db->quote($md["name"]->title), $db->quote($md["name"]->name), $db->quote($md["name"]->subject), $db->quote($md["name"]->value), 0, $db->quote($md["name"]->params), $db->quote($md["lang_code"]), $md["catid"]);
				$query->values(implode(",",$values));
			}
			$db->setQuery($query);			
			$db->execute();
		}

		echo $db->getErrorMsg();

	}
}
