<?php
/*
* @link http://kodcloud.com/
* @author warlee | e-mail:kodcloud@qq.com
* @copyright warlee 2014.(Shanghai)Co.,Ltd
* @license http://kodcloud.com/tools/license/license.txt
*/

class PluginBase{
	public $in;
	public $pluginName;
	public $pluginPath;
	public $pluginHost;
	public $pluginHostDefault;
	public $pluginApi;
	public $packageData;

	private $pluginLangArr;
	private $pluginConfig;
	function __construct(){
		global $in,$config;
		$this->config = &$config;
		$this->in = &$in;

		$this->pluginName = str_replace('Plugin','',get_class($this));
		$this->pluginPath = PLUGIN_DIR.$this->pluginName.'/';
		$this->pluginApi  = rtrim(APP_HOST,'/').'/index.php?pluginApp/to/'.$this->pluginName.'/';
		$this->pluginHost = $this->config['settings']['pluginHost'].$this->pluginName.'/';
		$this->pluginHostDefault = PLUGIN_HOST.$this->pluginName.'/';
		$this->pluginLangArr = $this->initLang();
		return $this;
	}
	public function regiest(){
		$this->hookRegiest(array());
		$this->setConfig(array());
	}
	public function install(){}
	public function update(){}
	public function unInstall(){}


	/**
	 * 注册hook到当前插件配置
	 * @param  [type] $array [description]
	 * @return [type]        [description]
	 */
	final function hookRegiest($array){
		$id = $this->pluginName;
		$systemConfig = &$this->config['settingSystem'];
		if(!is_array($systemConfig['pluginList'])){
			$systemConfig['pluginList'] = array();
		}
		if(is_array($systemConfig['pluginList'][$id])){ 
			$systemConfig['pluginList'][$id]['regiest'] = $array;
		}else{
			$systemConfig['pluginList'][$id] = array(
				'id'		=> $id,
				'regiest'	=> $array,
				'status'	=> 0,
				'config'	=> $this->getConfig()				
			);
		}
	}
	final function appIcon(){
		$package = $this->appPackage();
		$icon = '';
		if(isset($package['source'])){
			if($package['source']['icon']){
				$icon = '<img class="icon" src="'.$package['source']['icon'].'"/>';
			}else if($package['source']['className']){
				$icon = "<i class='icon font-icon ".$package['source']['className']."'></i>";
			}
		}
		return $icon;
	}
	final function filePath($path){
		if(substr($path,0,4) == 'http'){
			if(!request_url_safe($path)){
				show_json(LNG('url error!'),false);
			}
			$cacheName = md5($path.'kodcloud').'.'.get_path_ext($path);
			$cacheFile = $this->filePathName($cacheName);
			mk_dir(get_path_father($cacheFile));
			if(!file_exists($cacheFile)){
				$result = url_request($path,'DOWNLOAD',$cacheFile);
			}
			$path = $cacheFile;
		}else{
			$path = _DIR($path);
			//php7.1,含有中文文件,windows下 curl上传会有问题
			if( strtoupper(substr(PHP_OS, 0,3)) === 'WIN' &&
				version_compare(phpversion(), '7.1.0', '>=') &&
				preg_match("/([\x81-\xfe][\x40-\xfe])/", $path, $match)){

				$cacheName = hash_path($path).'.'.get_path_ext($path);
				$cacheFile = $this->filePathName($cacheName);
				mk_dir(get_path_father($cacheFile));
				if(!file_exists($cacheFile)){
					@copy($path,$cacheFile);
				}
				$path = $cacheFile;
			}
		}
		if (!file_exists($path)) {
			show_tips(LNG('file').' '.LNG('not_exists'));
		}
		return $path;
	}
	private function filePathName($fileName){
		if(! checkExtSafe($fileName)){$fileName = $fileName.'.txt';}
		return TEMP_PATH.$this->pluginName.'/files/'.$fileName;
	}

	/**
	 * 插件配置数据加载
	 * @return [type] [description]
	 */
	final function appPackage(){
		if($this->packageData){
			return $this->packageData;
		}
		$content = $this->parseFile($this->pluginPath.'package.json');
		$this->parseLang($content);
		$result = json_decode_force($content);
		if(!$result){
			return $content;
		}
		$this->packageData = $result;
		return $result;
	}
	
	/**
	 * 获取package.json中的数据;通过key获取，支持auther.copyright 多级获取
	 * @param  [type] $key [description]
	 * @return [type]      [description]
	 */
	public function packageInfoGet($key){
		$data = $this->appPackage();
		$result = null;
		$keyArr = explode('.',$key);
		for ($i = 0; $i < count($keyArr); $i++) {
			if($i == 0){
				$result = $data[$keyArr[$i]];
				continue;
			}
			if(is_array($result)){
				$result = $result[$keyArr[$i]];
			}else{
				return null;
			}
		}
		return $result;
	}
	public function packageVersion(){return $this->packageInfoGet('version');}
	public function packageTitle(){return $this->packageInfoGet('title');}
	public function packageCopyright(){return $this->packageInfoGet('auther.copyright');}

	private function parseFile($file){
		$content = file_get_contents($file);
		$replaceFrom = array(
			'{{pluginHost}}',
			'{{pluginHostDefault}}',
			'{{pluginApi}}',
			'{{pluginName}}',
			'{{pluginPath}}',
			'{{appHost}}',
			'{{staticPath}}',
			//"\r","\n"
		);
		$replaceTo = array(
			$this->pluginHost,
			$this->pluginHostDefault,
			$this->pluginApi,
			$this->pluginName,
			$this->pluginPath,
			APP_HOST,
			$this->config['settings']['staticPath'],
			//" "," "
		);
		$content = str_replace($replaceFrom,$replaceTo,$content);
		return $content;
	}

	private function parseLang(&$content){
		$pre = '{{LNG.';
		if(!strstr($content,$pre)){
			return;
		}
		preg_match_all('/{{LNG\..*}}/isU',$content,$match);
		if( !is_array($match) || count($match) == 0 ||
			!is_array($match[0]) || count($match[0]) == 0 ){
			return;
		}
		$replaceFrom = array();
		$replaceTo   = array();
		foreach ($match[0] as $key) {
			$langKey = substr($key,strlen($pre),-2); //{{LNG.file}}
			$langVal = LNG($langKey);

			$replaceFrom[] = $key;
			$replaceTo[]   = str_replace(
				array("\n","\r","\t",'"'),
				array(' ',' ','','\\"'),
				$langVal
			);
		}
		$content = str_replace($replaceFrom,$replaceTo,$content);
	}
	private function parseConfig(&$content){
		$config = $this->getConfig();
		$pre = '{{config.';
		if(!strstr($content,$pre)){
			return;
		}
		preg_match_all('/{{config\..*}}/isU',$content,$match);
		if( !is_array($match) || count($match) == 0 ||
			!is_array($match[0]) || count($match[0]) == 0 ){
			return;
		}
		$replaceFrom = array();
		$replaceTo   = array();
		foreach ($match[0] as $key) {
			$langKey = substr($key,strlen($pre),-2); //{{config.file}}
			$replaceFrom[] = $key;
			$replaceTo[]   = $config[$langKey];
		}
		$content = str_replace($replaceFrom,$replaceTo,$content);
	}

	/**
	 * 输出文件
	 * @param  [type] $file [description]
	 * @return [type]       [description]
	 */
	final function echoFile($file,$replace=false){
		$filePath = $this->pluginPath.$file;
		if(ACT == 'commonJs'){
			echo "\n/* [".$this->pluginName.'/'.$file."] */";
			if(!file_exists($filePath)){
				echo "   /* ==>[not exist]*/";
				return;
			}
		}
						
		$content = $this->parseFile($filePath);
		$this->parseLang($content);
		$this->parseConfig($content);
		if(is_array($replace) && count($replace) == 2){
			$content = str_replace($replace[0],$replace[1],$content);
		}
		echo "\n".$content;
	}

	/**
	 * 初始化多语言
	 * @return [type] [description]
	 */
	final function initLang(){
		$default = 'en';
		$path = $this->pluginPath.'i18n/';
		$lang = I18n::getType();
		$array = array();
		if(file_exists($path.$lang.'.php')){
			$array = include($path.$lang.'.php');
		}else if(file_exists($path.$default.'.php')){
			$array = include($path.$default.'.php');
		}
		if(!is_array($array)) return array();
		if(count($array) > 0){
			I18n::set($array);
		}
		return $array;
	}

	final function isFileExtence($st,$act){
		if(in_array($st,array('desktop','editor','explorer','share','api'))){
			return true;
		}
		return false;
	}

	/**
	 * 获取插件配置
	 * @return [type] [description]
	 */
	final function getConfig(){
		if(!$this->pluginConfig){
			$model = new PluginModel();
			$this->pluginConfig = $model->getConfig($this->pluginName);
		}
		return $this->pluginConfig;		
	}

	/**
	 * 修改插件配置
	 * @return [type] [description]
	 */
	final function setConfig($value){
		$model = new PluginModel();
		return $model->setConfig($this->pluginName,$value);
	}
}

