<?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)
{
	$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 AS ARRAY_KEY, name, module
		FROM ?_modules WHERE disable=0"
	);
	$module_conf=array();

	foreach ($modules as $module=>$mod) {
		if (file_exists(LAB_PATH_MODULES.'/'.$mod['module'].'/config.xml')) {
			$xml = simplexml_load_file(LAB_PATH_MODULES.'/'.$mod['module'].'/config.xml');
			if (count($xml->access->permis) || count($xml->configs->config)) {
				$module_conf[$module]['name']=$mod['name'];
				$pconf=$paccess=array();
				
				foreach ($parent_groups as $parent_group_id) {
					$config=$access=array();
					//подключаем права родительских групп для этого модуля
					$data=config::getModuleData($parent_group_id, $module);
					$config=$data['config'];
					$access=$data['access'];

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

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

				
				$config=$access=array();
				//подключаем права текущей группы
				$data=config::getModuleData($group_id, $module);
				$config=$data['config'];
				$access=$data['access'];

				if (count($xml->access->permis))
				foreach ($xml->access->permis as $permis) {
					$permis=get_object_vars($permis);
					//если текущий доступ пока не установлен, или вообще никаких прав пока не установлено, то устанавливаем его. 
					if (!empty($paccess[$permis['name']])) {
						$module_conf[$module]['access'][$permis['name']]=$paccess[$permis['name']];
					} else {
						$module_conf[$module]['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'=>isset($permis['user_only'])?$permis['user_only']:null);
					}
				}

				if (count($xml->configs->config))
				foreach ($xml->configs->config as $conf) {
					$current_conf=get_object_vars($conf);
					if (!empty($current_conf['values'])) {
						//TODO сделать чтобы в xml можно было отображать отдельно значение сохраняемое и отображаемое
						$values=get_object_vars($current_conf['values']);
						$values=$values['value'];
						if (!empty($current_conf['labels'])) {
							$labels=get_object_vars($current_conf['labels']);
							$labels=$labels['label'];
						} else {
							$labels=$values;
						}
						$module_conf[$module]['values'][$current_conf['name']]=array_combine($values, $labels);
					} elseif (!empty($current_conf['callback'])) {
						if (!file_exists(LAB_PATH_MODULES.'/'.$mod['module'].'/config.func.php')) {
							return LabCMS::i()->error(sprintf(_m('Не найден файл %s'), LAB_PATH_MODULES.'/'.$mod['module'].'/config.func.php'));
						}
						include_once LAB_PATH_MODULES.'/'.$mod['module'].'/config.func.php';
						//тут вызываем функцию возвращающую возможные значения
						$module_conf[$module]['values'][$current_conf['name']]=$current_conf['callback']();
					}
					//если установлено родительское значение и не установлено для текущего модуля, то оставляем родительское
					if (isset($pconf[$current_conf['name']]) && !isset($config[$current_conf['name']])) continue;
					//если установлено значение для текущей группы - используем его
					else $val=(isset($config[$current_conf['name']])?$config[$current_conf['name']]:null);
					
					$module_conf[$module]['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)
{
	foreach ($module_conf as $module=>$module_info) {
		//config::cleanModule($module, $group_id);
		if (count($module_info['access']))
		foreach ($module_info['access'] as $acc_key=>$acc_val) {
			config::saveAccess('module.'.$module.'.'.$acc_key, $data['access'][$module][$acc_key], $group_id);
		}
		if (count($module_info['config']))
		foreach ($module_info['config'] as $conf_key=>$conf_val) {
			//если значение  равно значению родителя, то удаляем
			if (isset($module_conf[$module]['config'][$conf_key]['parent'])
				&& $data['config'][$module][$conf_key]==$module_conf[$module]['config'][$conf_key]['val']
			) {
				config::delete('module.'.$module.'.'.$conf_key, $group_id, $module, 'config');
				continue;
			}
			//если значение пустое, то удаляем
			if (!isset($module_conf[$module]['config'][$conf_key]['parent']) && $data['config'][$module][$conf_key]=='') {
				config::delete('module.'.$module.'.'.$conf_key, $group_id, $module, 'config');
				continue;
			}
			config::save('module.'.$module.'.'.$conf_key, $data['config'][$module][$conf_key], $group_id, 'config');
		}
	}
	//если нет раздельного конфига, то чистим базу от таких конфигов
	if (!config::get('core.separate_config')) {
		Db::i()->query(
			"DELETE FROM ?_config
			WHERE group_id>0 AND `type`='config'"
		);
	}
}
