<?php
/**
* 設定値を保持するクラス
*
* PHP version 5
*
* @package    core
* @author     stk2k <stk2k@sazysoft.com>
* @copyright  2008 stk2k, sazysoft
*/

class Config extends Object
{
	private $_config;

	/*
	 *    コンストラクタ
	 */
	public function __construct( $data = NULL )
	{
		parent::__construct();

		$this->_config = $data ? $data : array();
	}

	/*
	 *　空か
	 */
	public function isEmptry()
	{
		return (count($this->_config) == 0);
	}

	/*
	 *　キーが存在するか
	 */
	public function keyExists( String $key )
	{
		return isset($this->_config[ "$key" ]);
	}

	/*
	 *　配列を追加
	 */
	public function append( $add )
	{
		if ( $add ){
			if ( is_array( $add ) ){
				$this->_config = array_merge( $this->_config, $add );
			}
			else{
				$this->_config[] = $add;
			}
		}
	}

	/*
	 *　第一階層のキーを取得
	 */
	public function getKeys()
	{
		return array_keys( $this->_config );
	}

	/*
	 * 設定値を文字列として取得する
	 */
	public function getString( String $key, String $default_value = NULL )
	{
		// 未設定なら空文字を返す
		if ( !isset($this->_config[ "$key" ]) ){
			return $default_value !== NULL ? $default_value : new String('');
		}

		// 設定値を取得
		$value = $this->_config[ "$key" ];

		// フォーマット確認
		if ( !is_string($value) ){
			_throw( new StringFormatException( $value, "key=[$key]" ) );
		}

		$value = s($value);

		// 返却
		return ConfigUtil::processMacro($value);
	}

	/*
	 * 設定値を配列として取得する
	 */
	public function getArray( String $key, Vector $default_value = NULL )
	{
		// 未設定なら空の配列を返す
		if ( !isset($this->_config[ "$key" ]) ){
			return $default_value !== NULL ? $default_value : new Vector();
		}

		// 設定値を取得
		$value = $this->_config[ "$key" ];

		// カンマで分割
		$array = explode( ',', $value );

		// 要素内の空白を削除
		foreach( $array as $key => $value ){
			$array[$key] = trim($value);
		}

		// 要素が１つで空ならデフォルト値を返す
		if ( count($array) == 1 && $array[0] === '' ){
			return $default_value !== NULL ? $default_value : new Vector();
		}

		// フォーマット確認
		if ( !is_array($array) ){
			_throw( new ArrayFormatException( $value, "key=[$key]" ) );
		}

		// 配列を返却
		return  v($array);
	}

	/*
	 * 設定値を連想配列として取得する
	 */
	public function getAssoc( String $key, Vector $default_value = NULL )
	{
		// 未設定ならデフォルト値を返す
		if ( !isset($this->_config[ "$key" ]) ){
			return $default_value !== NULL ? $default_value : new Vector();
		}

		// 設定値を取得
		$value = $this->_config[ "$key" ];

		// フォーマット確認
		if ( !is_array($value) && !($value instanceof Vector) ){
			_throw( new ArrayFormatException( $value, "key=[$key]" ) );
		}

		// 配列を返却
		return  v($value);
	}

	/*
	 * 設定値をブール値として取得する
	 */
	public function getBoolean( String $key, Boolean $default_value = NULL )
	{
		// 未設定ならFALSEを返す
		if ( !isset($this->_config[ "$key" ]) ){
			return $default_value !== NULL ? $default_value : new Boolean(FALSE);
		}

		// 設定値を取得
		$value = $this->_config[ "$key" ];

		if ( is_string($value) ){
			$value = (strlen($value) > 0 );
		}

		// フォーマット確認
		if ( !is_bool($value) ){
			_throw( new BooleanFormatException( $value, "key=[$key]" ) );
		}

		// ブール型にして返却
		return b($value);
	}

	/*
	 * 設定値を整数値として取得する
	 */
	public function getInteger( String $key, Integer $default_value = NULL )
	{
		// 未設定ならNULLを返す
		if ( !isset($this->_config[ "$key" ]) ){
			return $default_value !== NULL ? $default_value : new Integer(0);
		}

		// 設定値を取得
		$value = $this->_config[ "$key" ];

		// フォーマット確認
		if ( !is_integer($value) ){
			_throw( new IntegerFormatException( $value, "key=[$key]" ) );
		}

		// 整数型にして返却
		return (int)$value;
	}

	/*
	 *　設定値をダンプ
	 */
	public function dump( String $key = NULL )
	{
		$title     = get_class($this);
		$line_end  = '<BR>';
		$indent    = '---';
		if ( $key ){
			// 特定のキーに対する設定値をダンプ
			$value = $this->_config[ "$key" ];
			System::dumpVar( $value, $title, $line_end, $indent );
		}
		else{
			// すべての設定値をダンプ
			System::dumpArray( $this->_config, $title, $line_end, $indent );
		}
	}

}
return __FILE__;