'use strict';
Object.defineProperty(exports, "__esModule", { value: true });
const os = require("os");
const path = require("path");
const fs = require("fs-extra");
class Settings {
    /**
     *
     **/
    constructor() {
        this.file = path.join(os.homedir(), `/.mcopy/settings.json`);
        this.defaultState = {
            server: {
                port: 1111,
                enabled: true
            },
            devices: [],
            profile: 'mcopy',
            camera: {},
            projector: {},
            light: {},
            capper: {},
            timing: {}
        };
        this.state = this.freshState();
    }
    freshState() {
        return JSON.parse(JSON.stringify(this.defaultState));
    }
    /**
     *
     **/
    async checkDir() {
        const dir = path.join(os.homedir(), '.mcopy/');
        const exists = await fs.exists(dir);
        if (!exists) {
            try {
                await fs.mkdir(dir);
            }
            catch (err) {
                if (err.code === 'EEXIST')
                    return true;
                console.error(err);
            }
        }
        return true;
    }
    /**
     *
     **/
    async save() {
        const str = JSON.stringify(this.state, null, '\t');
        this.checkDir();
        try {
            await fs.writeFile(this.file, str, 'utf8');
        }
        catch (err) {
            console.error(err);
        }
    }
    /**
     *
     **/
    update(key, val) {
        this.state[key] = val;
    }
    /**
     *
     **/
    get(key) {
        return this.state[key];
    }
    /**
     *
     **/
    all() {
        return this.state;
    }
    /**
     *
     **/
    async restore() {
        let exists;
        let str;
        this.checkDir();
        exists = await fs.exists(this.file);
        if (exists) {
            str = await fs.readFile(this.file, 'utf8');
            this.state = JSON.parse(str);
            //console.dir(this.state)
        }
        else {
            this.save();
        }
    }
    /**
     *
     **/
    async reset() {
        const exists = await fs.exists(this.file);
        if (exists) {
            try {
                await fs.unlink(this.file);
            }
            catch (err) {
                console.error(err);
            }
        }
        this.state = this.freshState();
        this.restore();
    }
    ;
}
module.exports = new Settings();
//# sourceMappingURL=index.js.map