<?php
namespace KIF\Core;

use Exception;

/**
 * 
 * 配置类。作用:
 * 1、作为框架需要配置参数的那些类(如KIF\Cache、KIF\Dao 里的类)的参数获取接口。
 * 2、为KIF框架下的不同APP间 php in-process calls (APP间PHP进程内调用) 提供核心支持
 * 
 * @author gaoxiaogang@gmail.com
 *
 */
class Config {
	
	static private $instance;
	
	/**
	 * 所有app的配置集
	 * array(
	 * 		md5($app_conf_path) => array(
	 * 
	 * 		),
	 * 		... ,
	 * );
	 * @var array
	 */
	static protected $appConfigs = array();
	
	/**
	 * 
	 * 当前app的配置
	 * @var array
	 */
	protected $appConfig;
	
	/**
	 * 
	 * 不允许直接 new
	 */
	private function __construct() {
		
	}
	
	/**
	 * 
	 * 载入配置,如果成功,返回instance
	 * @param string $app_conf_path 配置文件的路径
	 * @return KIF\Core\Config
	 */
	static public function load($app_conf_path) {
		$app_conf_path = realpath($app_conf_path);
		$app_conf_key = md5($app_conf_path);
		if (!isset(self::$appConfigs[$app_conf_key])) {
			$config = include($app_conf_path);
			if (!is_array($config)) {
				throw new Exception("load app_conf_path fail: {$app_conf_path}");
			}
			# 将conf的path存进来
			$config['conf_path'] = $app_conf_path;
			
			self::$appConfigs[$app_conf_key] = $config;
		}
		
		if (is_null(self::$instance)) {
			self::$instance = new self();
		}
		
		self::$instance->appConfig = self::$appConfigs[$app_conf_key];
		
		return self::$instance;
	}
	
	/**
	 * 
	 * 单例模式
	 * @param string $app_conf_path
	 * @return KIF\Core\Config
	 */
	static public function getInstance() {
		if (is_null(self::$instance)) {
			self::$instance = new self();
		}
		
		if (is_null(self::$instance->appConfig)) {
			throw new Exception('instance appconfig is null, pleace run KIF\Core\Config::load !');
		}
		
		return self::$instance;
	}
	
	/**
	 * 
	 * 获取指定配置项的值
	 * @param string $key
	 * @return mixed
	 */
	public function get($key) {
		if (empty($key)) {
            return false;
        }   
    
        $keys = explode('.', $key);
    
        $value = $this->appConfig;
    
        foreach ($keys as $tmpKey) {
            if (!isset($value[$tmpKey])) {
                return false;
            }   
            $value = $value[$tmpKey];
        }   
        return $value;
	}
	
	/**
	 * 
	 * 指定配置项是否设置了
	 * @param string $key
	 * @return boolean
	 */
	public function exists($key) {
		return isset($this->appConfig[$key]);
	}
	
	/**
	 * 
	 * 获取当前的配置信息
	 * @return array
	 */
	public function current() {
		return $this->appConfig;
	}
	
	/**
	 * 
	 * 获取所有app的配置集
	 * @return array
	 */
	static public function all() {
		return self::$appConfigs;
	}
}