<?php
/**
* 環境別の設定を扱うクラス
*
* PHP version 5
*
* @package    core
* @author     stk2k <stk2k@sazysoft.com>
* @copyright  2008 stk2k, sazysoft
*/

class Profile
{
	static $config_file;
	static $config;
	static $profile_name;

	/*
	 * プロファイル名を取得
	 */
	public static function getProfileName()
	{
		return self::$profile_name;
	}

	/*
	 * キー一覧を取得
	 */
	public static function getKeys()
	{
		return array_keys( self::$config );
	}

	/*
	 * 設定ファイル名を取得
	 */
	public static function getConfigFile()
	{
		return self::$config_file;
	}

	/*
	 * グローバル設定値を整数として取得
	 */
	public static function getInteger( String $key, $defaultValue = NULL )
	{
		if ( !isset(self::$config["$key"]) ){
			return i($defaultValue);
		}
		$value = i(self::$config["$key"]);
		return $value;
	}

	/*
	 * グローバル設定値を文字列として取得
	 */
	public static function getString( String $key, $default_value = NULL )
	{
		// 未設定なら空文字を返す
		if ( !isset(self::$config[ "$key" ]) ){
			return $default_value !== NULL ? $default_value : new String('');
		}

		// 設定値を取得
		$value = self::$config[ "$key" ];

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

		$value = s($value);

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

	/*
	 * グローバル設定値をブール値として取得
	 */
	public static function getBoolean( String $key, $default_value = NULL  )
	{
		if ( !isset(self::$config[ "$key" ]) ){
			return $default_value !== NULL ? $default_value : new Boolean(FALSE);
		}

		// 設定値を取得
		$value = self::$config[ "$key" ];

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

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

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

	/*
	 * グローバル設定値を配列として取得
	 */
	public static function getArray( String $key, $default_value = NULL )
	{

		// 未設定なら空の配列を返す
		if ( !isset(self::$config[ "$key" ]) ){
			return $default_value !== NULL ? $default_value : new Vector();
		}

		// 設定値を取得
		$value = self::$config[ "$key" ];

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

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

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

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

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

	/*
	 * グローバルの設定ファイルを読み込む
	 */
	public static function load( $profile_name )
	{
		// 設定ファイルの場所を特定
		$config_file = _webapp_path( s('config/profiles'), s("$profile_name.global.ini") );

		// sectionなしでiniファイルをパース
		$config = parse_ini_file($config_file,FALSE);

		// プロファイル名
		if ( $config['PROFILE_NAME'] ){
			$profile_name = $config['PROFILE_NAME'];
		}

		// 設定を保存
		self::$config = $config;
		self::$config_file = basename($config_file);
		self::$profile_name = $profile_name;

	}
}

return __FILE__;