<?php
/**
 * @name		Page Builder CK
 * @package		com_pagebuilderck
 * @copyright	Copyright (C) 2015. All rights reserved.
 * @license		GNU General Public License version 2 or later; see LICENSE.txt
 * @author		Cedric Keiflin - https://www.template-creator.com - https://www.joomlack.fr
 */


// No direct access
defined('_JEXEC') or die;

use Pagebuilderck\CKController;
use Pagebuilderck\CKFof;

class PagebuilderckController extends CKController
{
	static $releaseNotes;

	static $currentVersion;

	public function display($cachable = false, $urlparams = false)
	{
		// load the views only in backend
		if (CKFof::isAdmin()) {
			$view	= $this->input->get('view', 'pages');
			$this->input->set('view', $view);
		}
		parent::display();

		return $this;
	}

	/**
	 * Load the backup file
	 * 
	 * @return string, the html content
	 */
	public function ajaxDoRestoration() {
		// security check
		CKFof::checkAjaxToken();

		$id = $this->input->get('id', 0, 'int');
		$name = $this->input->get('name','', 'string');
		$isLocked = $this->input->get('isLocked', 0, 'int');
		$filename = ($isLocked ? 'locked' : 'backup') . '_' . $id . '_' . $name . '.pbck';
		$path = JPATH_ROOT . '/administrator/components/com_pagebuilderck/backup/' . $id . '_bak';
		$content = file_get_contents($path . '/' . $filename);
		$backup = json_decode($content);

		echo str_replace('|URIROOT|', JUri::root(true), $backup->htmlcode);
		exit();
	}

	/**
	 * Load a method from the Page Builder CK Params
	 * 
	 * @return mixed, the method return
	 */
	public function ajaxParamsCall() {
		// security check
		CKFof::checkAjaxToken();

		$class = $this->input->get('class', '', 'cmd');
		$method = $this->input->get('method', '', 'cmd');
		$params = $this->input->get('params', '', 'array');
		if ($paramsClass = PagebuilderckHelper::getParams($class)) {
			echo $paramsClass->$method($params);
		}
		exit();
	}

	/**
	 * Switch between lock / unlock state for the backup file
	 * 
	 * @return string, the html content
	 */
	public function ajaxToggleLockBackup() {
		// security check
		CKFof::checkAjaxToken();

		$id = $this->input->get('id', 0, 'int');
		$isLocked = $this->input->get('isLocked', 0, 'int');
		$filename = $this->input->get('filename', '', 'string');
		// locked_38_09-02-2016-11-30-13
		$filename = ($isLocked ? 'locked' : 'backup') . '_' . $id . '_' . $filename . '.pbck';
		$file = JPATH_ROOT . '/administrator/components/com_pagebuilderck/backup/' . $id . '_bak/' . $filename;
		// $isLocked = stristr($file, 'locked_');
		if ($isLocked) {
			$newFilename = str_replace('locked_', 'backup_', $filename);
		} else {
			$newFilename = str_replace('backup_', 'locked_', $filename);
		}
		$toFile = JPATH_ROOT . '/administrator/components/com_pagebuilderck/backup/' . $id . '_bak/' . $newFilename;

		if (@JFile::move($file, $toFile)) {
			echo '1';
		} else {
			echo '0';
		}
		exit();
	}

	/**
	 * Get the page html code from it id
	 * 
	 * @return string, the html code
	 */
	public function ajaxLoadPageHtml() {
		// security check
		CKFof::checkAjaxToken();

		PagebuilderckHelper::ajaxLoadPageHtml();
	}

	/**
	 * Get the page html code from its id
	 * 
	 * @return string, the html code
	 */
	public static function ajaxLoadLibraryHtml() {
		// security check
		CKFof::checkAjaxToken();

		$id = $this->input->get('id', 0, 'string');
//		$page = PagebuilderckHelper::getPage($id);
		$url = 'https://media.joomlack.fr/api/pagebuilderck/page/' . $id;

		try {
			$file = file_get_contents($url);
		} catch (Exception $e) {
			echo 'ERROR : ',  $e->getMessage(), "\n";
			exit();
		}
		$file = json_decode($file);
		if (isset($file->htmlcode)) {
			echo trim($file->htmlcode);
		} else {
			echo 'error';
		}
		exit();
	}

	/*
	 * Check that the user can do
	 */
	public function checkAjaxUserEditRight() {
		$user		= JFactory::getUser();
		$canEdit    = $user->authorise('core.edit', 'com_pagebuilderck');
		if (! $canEdit) {
			echo '{"status": "0", "msg": "' . JText::_('CK_ERROR_USER_NO_AUTH') . '"}';
			exit();
		}
	}

	/*
	 * Save the current styles into a favorite file
	 */
	public function ajaxSaveFavorite() {
		// security check
		CKFof::checkAjaxToken();

		$this->checkAjaxUserEditRight();

		$favorite = $this->input->get('favorite', '', 'raw');
		$id = $this->input->get('id', -1, 'int');
		$path = PAGEBUILDERCK_PARAMS_PATH . '/favorites';

		$error = 0;
		if (is_numeric($id) && (int) $id > -1) {
			$i = (int) $id;
		} else {
			$i = count(JFolder::files($path, '.fck3'));
			$j = 0;
			while (file_exists(PAGEBUILDERCK_PARAMS_PATH . '/favorites/favorite'.$i.'.fck3') && $j < 1000) {
				$i++;
				$j++;
			}
			if ($j >= 1000) {
				echo 'ERROR reach loop of 1000 files';
				$error = 1;
			}
		}

		$exportfiledest = PAGEBUILDERCK_PARAMS_PATH . '/favorites/favorite'.$i.'.fck3';
		$exportfiletext = $favorite;

		if (!file_put_contents($exportfiledest, $exportfiletext) || $error == 1) {
			$msg = JText::_('CK_ERROR_CREATING_FAVORITEFILE');
			$status = 0;
		} else {
			$msg = $i;
			$status = 1;
		}

		echo '{"status": "' . $status . '", "msg": "' . $msg . '"}';
		// echo $msg;
		exit();
	}

	/*
	 * Load the favorite file
	 */
	public function ajaxLoadFavorite() {
		// security check
		CKFof::checkAjaxToken();

		$name = $this->input->get('name', '', 'string');
		$folder = $this->input->get('folder', '', 'string');

		$path = PAGEBUILDERCK_PARAMS_PATH . '/'.$folder.'/';

		$content = file_get_contents($path . $name . '.fck3');
		echo $content;
		exit();
	}

	/*
	 * Remove the favorite file from the folder
	 */
	public function ajaxRemoveFavorite() {
		// security check
		CKFof::checkAjaxToken();

		$this->checkAjaxUserEditRight();

		$name = $this->input->get('name', '', 'string');

		$msg = '';
		if (!JFile::delete(PAGEBUILDERCK_PARAMS_PATH . '/favorites/' . $name . '.fck3')) {
			$msg = JText::_('CK_ERROR_DELETING_FAVORITEFILE');
			$status = 0;
		} else {
			$status = 1;
		}

		echo '{"status": "' . $status . '", "msg": "' . $msg . '"}';
		exit();
	}

	function ajaxShowMenuItems() {
		// security check
		CKFof::checkAjaxToken();

		$parentId = $this->input->get('parentid', 0, 'int');
		$menutype = $this->input->get('menutype', '', 'string');

		$model = $this->getModel('Menus', '', array());
		$items = $model->getChildrenItems($menutype, $parentId);

		$links = array();
		$imagespath = PAGEBUILDERCK_MEDIA_URI .'/images/';
		?>
		<div class="cksubfolder">
		<?php
		foreach ($items as $item) {
			$aliasId = $item->id;
			if ($item->type == 'alias') {
				$itemParams = new JRegistry($item->params);
				$aliasId = $itemParams->get('aliasoptions', 0);
			}
			$Itemid = substr($item->link,-7,7) == 'Itemid=' ? $aliasId : '&Itemid=' . $aliasId;
			$hasChild = (int)$item->rgt - (int)$item->lft > 1 ? true : false;
		?>
			<div class="ckfoldertree parent">
				<div class="ckfoldertreetoggler <?php if (! $hasChild) { echo 'empty'; } ?>" onclick="ckMenusToggleTreeSub(this, <?php echo $item->id ?>)" data-menutype="<?php echo $item->menutype; ?>"></div>
				<div class="ckfoldertreename hasTip" title="<?php echo $item->link . $Itemid ?>" onclick="ckSetMenuItemUrl('<?php echo $item->link . $Itemid ?>')"><span class="icon-link"></span><?php echo $item->title; ?></div>
			</div>
		<?php
		}
		?>
		</div>
		<?php
		exit;
	}

	public function ajaxSaveElement() {
		// security check
		CKFof::checkAjaxToken();

		$name = $this->input->get('name', '', 'string');
		$type = $this->input->get('type', '', 'string');
		$html = $this->input->get('html', '', 'raw');
		// $html = json_encode($this->input->get('html', '', 'raw'));

		$model = $this->getModel('Elements', '', array());
		$id = $model->ajaxSave($name, $type, $html);
		$pluginsType = PagebuilderckHelper::getPluginsMenuItemType();
		$image = $pluginsType[$type]->image;
		$returncode = '<div data-type=\"' . $type . '\" data-id=\"' . $id . '\" class=\"menuitemck ckmyelement\" >'
						. '<div>'
							. '<div class=\"menuitemck_title\">' . $name . '</div>'
						. '</div>'
						. '<img src=\"' . $image . '\" />'
					. '</div>';
		echo '{"status" : "' . ($id == false ? '0' : '1') . '", "code" : "' . $returncode . '"}';
		exit;
	}

	public function ajaxAddElementItem() {
		// security check
		CKFof::checkAjaxToken();
	
		$id = $this->input->get('id', '', 'int');

		$model = $this->getModel('Element');
		$result = $model->getHtml($id);
		echo ($result == false ? 'ERROR' : $result);
		exit;
	}

	public function fixDb() {
//		$this->searchTable('elements');
		$db = JFactory::getDbo();
		$tablesList = $db->getTableList();
		// test if the table not exists
		$tableElementsExists = in_array($db->getPrefix() . 'pagebuilderck_elements', $tablesList);
		if (! $tableElementsExists) {
			$this->updateTable('2.2.0');
		}

		$tableCategoriesExists = in_array($db->getPrefix() . 'pagebuilderck_categories', $tablesList);
		if (! $tableCategoriesExists) {
			$this->updateTable('2.14.0');
		}

		$tableStylesExists = in_array($db->getPrefix() . 'pagebuilderck_styles', $tablesList);
		if (! $tableStylesExists) {
			$this->updateTable('2.16.0');
		}
	}

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

		$tablesList = $db->getTableList();
		$tableExists = in_array($db->getPrefix() . 'pagebuilderck_' . $tableName, $tablesList);
		// test if the table not exists

		if (! $tableExists) {
			$query = $this->getSqlQueryElements();
			$db->setQuery($query);
//			// add the SQL field to the main table
//			$query = 'ALTER TABLE `' . $table . '` ADD `' . $name . '` text NOT NULL;';
			if (! $db->execute($query)) {
				echo '<p class="alert alert-danger">Error during table ' . $tableName . ' creation process !</p>';
			} else {
				echo '<p class="alert alert-success">Table ' . $tableName . ' created with success !</p>';
			}
		} 
	}

	/*private function getSqlQueryElements() {
		$query = "CREATE TABLE IF NOT EXISTS `#__pagebuilderck_elements` (
  `id` int(10) NOT NULL AUTO_INCREMENT,
  `title` varchar(255) NOT NULL,
  `description` tinytext NOT NULL,
  `type` varchar(50) NOT NULL,
  `ordering` int(11) NOT NULL,
  `state` int(10) NOT NULL DEFAULT '1',
  `catid` varchar(255) NOT NULL,
  `htmlcode` longtext NOT NULL,
  `checked_out` varchar(10) NOT NULL,
  PRIMARY KEY (`id`)
) DEFAULT CHARSET=utf8;";
		return $query;
	}*/

	/*
	* update the table
	*/
	function updateTable($version) {
		$sqlsrc = JPATH_ROOT.'/administrator/components/com_pagebuilderck/sql/updates/' . $version . '.sql';
		$query = file_get_contents($sqlsrc);
		$db = JFactory::getDbo();
		$db->setQuery($query);
		if (!$db->execute()) {
			echo '<p class="alert alert-danger">Error during table update for version ' . $version . '</p>';
		} else {
			echo '<p class="alert alert-success">Table successfully updated for version ' . $version . '</p>';
		}
	}

	/*
	 * DO NOT USE, use ajaxSetPluginOption
	 */
	public function ajaxSavePluginCustomData() {
		// security check
		CKFof::checkAjaxToken();

		$customdata = $this->input->get('customdata', array(), 'array');
		$plugin = $this->input->get('plugin', '', 'string');

		$query = "SELECT custom_data FROM #__extensions WHERE type='plugin' AND element ='" . $plugin . "' AND folder='pagebuilderck'";
		$db = JFactory::getDbo();
		$db->setQuery($query);
		$data = $db->loadResult();

//		var_dump($customdata);
		$options = unserialize($data);
//		var_dump($options);
		$newdata = serialize($customdata);

		$query = "UPDATE #__extensions "
				. "SET custom_data = '" . $newdata . "'"
				. "WHERE type='plugin' AND element ='" . $plugin . "' AND folder='pagebuilderck' ";
		$db->setQuery($query);
		$result = $db->execute();
	}

	/*
	 * DO NOT USE, use ajaxGetPluginOption
	 */
	public function ajaxLoadPluginCustomData() {
		// security check
		CKFof::checkAjaxToken();

		$plugin = $this->input->get('plugin', '', 'string');
		$key = $this->input->get('key', '', 'string');

		$query = "SELECT custom_data FROM #__extensions WHERE type='plugin' AND element ='" . $plugin . "' AND folder='pagebuilderck'";
		$db = JFactory::getDbo();
		$db->setQuery($query);
		$data = $db->loadResult();

//		var_dump($data);
		$options = unserialize($data);
//		var_dump($options);
		echo isset($options[$key]) ? $options[$key] : '0';
		exit;
	}

	public function ajaxSaveCustomCss() {
		// security check
		CKFof::checkAjaxToken();

		$id = $this->input->get('id', 0, 'int');
		$name = $this->input->get('name', '', 'string');
		$customcss = $this->input->get('customcss', '', 'raw');

		$data = array();
//		$data['id'] = 0;
		$data['name'] = $name;
		$data['value'] = $customcss;

		$query = "SELECT id FROM #__pagebuilderck_options WHERE name='" . $name . "'";
		$data['id'] = (int) \Pagebuilderck\CKFof::dbLoadResult($query);

		$id = \Pagebuilderck\CKFof::dbStore('#__pagebuilderck_options', $data);

		echo '{"status" : "' . ($id == false ? '0' : '1') . '", "code" : "' . $id . '"}';
		exit;
	}

	public function ajaxSetUserState() {
		// security check
		CKFof::checkAjaxToken();

		$key = $this->input->get('key', '', 'string');
		$value = $this->input->get('value', '', 'string');

		$app = JFactory::getApplication();
		$app->setUserState($key, $value);
	}

	public function ajaxSetPluginOption() {
		PagebuilderckHelper::ajaxSetPluginOption();
	}

	public function ajaxGetPluginOption() {
		PagebuilderckHelper::ajaxGetPluginOption();
	}
}