var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, Promise, generator) {
    return new Promise(function (resolve, reject) {
        generator = generator.call(thisArg, _arguments);
        function cast(value) { return value instanceof Promise && value.constructor === Promise ? value : new Promise(function (resolve) { resolve(value); }); }
        function onfulfill(value) { try { step("next", value); } catch (e) { reject(e); } }
        function onreject(value) { try { step("throw", value); } catch (e) { reject(e); } }
        function step(verb, value) {
            var result = generator[verb](value);
            result.done ? resolve(result.value) : cast(result.value).then(onfulfill, onreject);
        }
        step("next", void 0);
    });
};
import { Util } from './util/util';
import { Storage } from './util/storage';
export class Config {
    constructor() {
        this._config = {};
        this._locked = ['_config', '_defaults'];
    }
    get(key) {
        return this._config[key];
    }
    set(key, value, castToType = false) {
        if (!this.islocked(key)) {
            if (castToType) {
                value = Util.castToType(value);
            }
            return this._config[key] = value;
        }
        else {
            console.error('Config: property "' + key + '" can not be changed.');
        }
    }
    add(object, extend = false, castToType = false) {
        const self = this;
        if (!extend) {
            Object.keys(object).forEach((key) => {
                self.set(key, object[key], castToType);
            });
        }
        else {
            this.extend(object);
        }
    }
    fetch(url, extend = false) {
        return __awaiter(this, void 0, Promise, function* () {
            const self = this;
            // if(self.get('api_headers')){
            //
            // }
            // let config =  await fetch(url, {headers: self.get('api_headers')})
            let config = yield fetch(url)
                .then(function (response) {
                return response.json();
            })
                .catch(function (error) {
                console.log('config fetch error:', error.message);
            });
            if (extend) {
                this.extend(config);
            }
            else {
                Object.keys(config).forEach((k, i) => {
                    self.set(k, config[k]);
                });
            }
            return config;
        });
    }
    extend(object, target = this._config) {
        Util.deepAssign(target, object);
    }
    all() {
        return this._config;
    }
    getLocalSettings(id) {
        if (window.localStorage && window.localStorage.getItem(id)) {
            this.add(Storage.restoreLocalModel(id));
        }
    }
    setLocalSettings(id, settings = this._config) {
        if (window.localStorage) {
            Storage.saveLocalModel(settings, id);
        }
    }
    setDefaults(configDefaults) {
        const self = this;
        self._defaults = configDefaults;
        Object.keys(configDefaults).forEach((k) => {
            self.set(k, Util.copy(configDefaults[k]));
        });
    }
    restoreDefaults() {
        const self = this;
        Object.keys(self._defaults).forEach((k) => {
            self.set(k, self._defaults[k]);
        });
    }
    islocked(key) {
        // todo:
        this._locked.forEach((k) => {
            if (k === key) {
                console.log('Config error: property "' + k + '" is protected');
                return true;
            }
        });
    }
    // todo
    lock(key) {
        // todo:
        return false;
        // this._locked.forEach((k) => {
        //
        // })
    }
    unLock(key) {
        // todo:
        // this._locked.forEach((k) => {
        //
        // })
    }
    initXdomain(object) {
        if (typeof window !== 'undefined' && window['xdomain']) {
            window['xdomain'].masters(object.masters);
            window['xdomain'].slaves(object.slaves);
        }
    }
    ;
}
//# sourceMappingURL=config.js.map