<?php

/*
* @package LabCMS
* @copyright (c) 2006 Alexander Levin aka Loki (loki_angel@mail.ru)
* @support http://labcms.ru
* @license http://opensource.org/licenses/gpl-license.php GNU Public License
*/


	
	function getUserGroupConf($group_id)
	{
		if (!Db::i()->selectCell("SELECT group_id FROM ?_groups WHERE group_id=?", $group_id)) return LabCMS::i()->error('Группа не найдена');
		$parent_groups=User::getParentGroups($group_id);

		if (count($parent_groups)) $groups=Db::i()->selectCol("SELECT group_id AS ARRAY_KEY, group_name FROM ?_groups WHERE group_id IN (?a)", $parent_groups);

		$modules=Db::i()->select("SELECT module_id AS ARRAY_KEY, name, module FROM ?_modules WHERE disable=0");
		$module_conf=array();

		foreach($modules as $module_id=>$module)
		{
			if (file_exists(LAB_PATH_MODULES.'/'.$module['module'].'/config.xml'))
			{
				$xml = simplexml_load_file(LAB_PATH_MODULES.'/'.$module['module'].'/config.xml');
				if (count($xml->access->permis) || count($xml->configs->config))
				{
					$module_conf[$module_id]['name']=$module['name'];
					$pconf=$paccess=array();
					
					foreach($parent_groups as $group)
					{
						$config=$access=array();
						//если есть файлы родительских групп для этого модуля, то подключаем их
						if (file_exists(LAB_PATH_DATA.'/configs/'.$group.'_'.$module_id.'.conf'))
						include(LAB_PATH_DATA.'/configs/'.$group.'_'.$module_id.'.conf');

						//если для модуля предусмотрена настройка прав, то то вносим наследуемые права
						if (count($xml->access->permis))
						foreach($xml->access->permis as $permis)
						{
							$permis=get_object_vars($permis);
							if ($access[$permis['name']]) //если данные права уже установлены у кого-то из родителей, то  помечаем имя группы
							{
								$paccess[$permis['name']]=array('val'=>1, 'describe'=>$permis['describe'], 'title'=>$permis['title'], 'group'=>$groups[$group]);
							}
						}

						//если для модуля предусмотрены настройки, то смотрим какие из них наследуются
						if (count($xml->configs->config))
						foreach($xml->configs->config as $conf)
						{
							$parent_conf=get_object_vars($conf);
							if (isset($config[$parent_conf['name']])) $pconf[$parent_conf['name']]=array('val'=>$config[$parent_conf['name']], 'title'=>$parent_conf['title'], 'describe'=>$parent_conf['describe'], 'type'=>$parent_conf['type'], 'parent'=>true);
						}
					}

					
					$config=$access=array();
					//подключаем права текущей группы
					if (file_exists(LAB_PATH_DATA.'/configs/'.$group_id.'_'.$module_id.'.conf'))
					include(LAB_PATH_DATA.'/configs/'.$group_id.'_'.$module_id.'.conf');

					if (count($xml->access->permis))
					foreach($xml->access->permis as $permis)
					{
						$permis=get_object_vars($permis);
						//если текущий доступ пока не установлен, или вообще никаких прав пока не установлено, то устанавливаем его. 
						if ($paccess[$permis['name']])
						{
							$module_conf[$module_id]['access'][$permis['name']]=$paccess[$permis['name']];
						}
						else
						{
							$module_conf[$module_id]['access'][$permis['name']]=array(
										'val'=>(isset($access[$permis['name']])?$access[$permis['name']]:null),
										'describe'=>(isset($permis['describe'])?$permis['describe']:null),
										'title'=>(isset($permis['title'])?$permis['title']:null),
										'user_only'=>$permis['user_only']);
						}
					}

					if (count($xml->configs->config))
					foreach($xml->configs->config as $conf)
					{
						$current_conf=get_object_vars($conf);
						if (!empty($current_conf['values']))
						{
							//TODO сделать чтобы в xml можно было отображать отдельно значение сохраняемое и отображаемое
							$tmp=get_object_vars($current_conf['values']);
							$module_conf[$module_id]['values'][$current_conf['name']]=array_combine($tmp['value'], $tmp['value']);
						}
						elseif (!empty($current_conf['callback']))
						{
							include_once LAB_PATH_MODULES.'/'.$module['module'].'/config.func.php';
							//тут вызываем функцию возвращающую возможные значения
							$module_conf[$module_id]['values'][$current_conf['name']]=$current_conf['callback']();
						}
						//если установлено родительское значение и не установлено для текущего модуля, то оставляем родительское
						if (isset($pconf[$current_conf['name']]) && !isset($config[$current_conf['name']])) continue;
						//если не установлено никаких значений - выставляем значение по умолчанию
						//if (!isset($module_conf[$module_id]['config'][$current_conf['name']]) && !isset($config[$current_conf['name']])) $val=$current_conf['default'];
						//если установлено значение для текущей группы - используем его
						else $val=(isset($config[$current_conf['name']])?$config[$current_conf['name']]:null);
						
						$module_conf[$module_id]['config'][$current_conf['name']]=array('val'=>$val,
								'title'=>(isset($current_conf['title'])?$current_conf['title']:null),
								'describe'=>(isset($current_conf['describe'])?$current_conf['describe']:null),
								'type'=>(isset($current_conf['type'])?$current_conf['type']:null));
					}
				}
			}
		}
		return $module_conf;
	}
	
	function updateUserGroupConf($group_id, $module_conf, $data)
	{
		//прежде чем генерить новую конфигурацию - прибиваем старую
		$old_files=glob(LAB_PATH_DATA.'/configs/'.$group_id.'_*.conf');
		if ($old_files) foreach($old_files as $fn) {unlink($fn);} 

		foreach($module_conf as $module_id=>$module_info)
		{
			$smarty_conf=$smarty_acc=array();
			Tpl::i()->clearAssign("access_tmp");
			Tpl::i()->clearAssign("config_tmp");
			
			if (count($module_info['access']))
			foreach($module_info['access'] as $acc_name=>$acc_arr)
			{
				if ($data['access'][$module_id][$acc_name]) Tpl::i()->append('access_tmp', $acc_name);
			}
			
			$config_tmp=array();
			if (count($module_info['config']))
			foreach($module_info['config'] as $conf_name=>$conf_arr)
			{
				//если значение  равно значению родителя, то пропускаем
				if (isset($module_conf[$module_id]['config'][$conf_name]['parent']) && $data['config'][$module_id][$conf_name]==$module_conf[$module_id]['config'][$conf_name]['val']) continue;
				//если значение пустое, то пропускаем
				if (!isset($module_conf[$module_id]['config'][$conf_name]['parent']) && $data['config'][$module_id][$conf_name]=='') continue;
				$config_tmp[$conf_name]=$data['config'][$module_id][$conf_name];
			}
			
			Tpl::i()->assign('config_tmp', $config_tmp);

			if (Tpl::i()->getTemplateVars('config_tmp') || Tpl::i()->getTemplateVars('access_tmp'))
			{
				file_put_contents(LAB_PATH_DATA.'/configs/'.$group_id.'_'.$module_id.'.conf', Tpl::i()->fetch(LAB_PATH_TEMPLATE.'/default/admin_groups/conf.tpl'));
				chmod(LAB_PATH_DATA.'/configs/'.$group_id.'_'.$module_id.'.conf', 0666);
			}
		}
	}
