'use strict'
import fs from 'fs-extra';
import path from 'path';

/**
 * Elder Software CommonLib
 * アプリケーション設定マネージャ
 *
 * @since 2016/01/04
 * @author RaTTiE
 */
export default class SettingManager {
	/**
	 * コンストラクタ。
	 */
	constructor() {
		this.paths = [];
		this.setting = null;
		this.filename = 'setting.json';
	}

	/**
	 * アプリケーション設定をロードする。
	 *
	 * @return ロードしたアプリケーション設定。
	 */
	load() {
		this.setting = null;
		var i;
		for (i = 0; i < this.paths.length; i++) {
			var jsonPath = path.resolve(this.paths[i], this.filename);
			try {
				if (!fs.statSync(jsonPath).isFile()) continue;
				this.setting = JSON.parse(fs.readFileSync(jsonPath, 'utf8'));

				break;
			} catch (err) {
				//console.log(err);

				continue;
			}
		}

		if (this.setting == null) {
			throw new Error('アプリケーション設定のロードに失敗しました。');
		}

		// デフォルト設定をマージ
		var marge = (src, dest) => {
			for (var key in src) {
				if (dest[key] === undefined) {
					dest[key] = src[key];
				}

				if (src[key] != null) {
					if (typeof src[key] == 'object' && !Array.isArray(src[key])) {
						marge(src[key], dest[key]);
					}
				}
			}
		};

		for (var j = this.paths.length - 1; j > i; j--) {
			var jsonPath = path.resolve(this.paths[j], this.filename);
			try {
				if (!fs.statSync(jsonPath).isFile()) continue;
				var setting = JSON.parse(fs.readFileSync(jsonPath, 'utf8'));

				marge(setting, this.setting);
			} catch (err) {
				//console.log(err);

				continue;
			}
		}

		return this.setting;
	}

	/**
	 * アプリケーション設定をセーブする。
	 */
	save() {
		var jsonPath = path.resolve(this.paths[0], this.filename);

		fs.writeFileSync(jsonPath, JSON.stringify(this.setting, null, '  '));
	}

	/**
	 * リソース取得パスを追加する。
	 *
	 * @param resourcePath 追加対象のパス。
	 */
	addPath(resourcePath) {
		this.paths.push(resourcePath);
	}
}

module.exports = SettingManager;
