const STORAGE_NAME = 'nginx-proxy-manager-tokens';

/**
 * @returns {Array}
 */
const getStorageTokens = function () {
    let json = window.localStorage.getItem(STORAGE_NAME);
    if (json) {
        try {
            return JSON.parse(json);
        } catch (err) {
            return [];
        }
    }

    return [];
};

/**
 * @param  {Array}  tokens
 */
const setStorageTokens = function (tokens) {
    window.localStorage.setItem(STORAGE_NAME, JSON.stringify(tokens));
};

const Tokens = {

    /**
     * @returns {Number}
     */
    getTokenCount: () => {
        return getStorageTokens().length;
    },

    /**
     * @returns {Object}    t,n
     */
    getTopToken: () => {
        let tokens = getStorageTokens();
        if (tokens && tokens.length) {
            return tokens[0];
        }

        return null;
    },

    /**
     * @returns {String}
     */
    getNextTokenName: () => {
        let tokens = getStorageTokens();
        if (tokens && tokens.length > 1 && typeof tokens[1] !== 'undefined' && typeof tokens[1].n !== 'undefined') {
            return tokens[1].n;
        }

        return null;
    },

    /**
     *
     * @param   {String}  token
     * @param   {String}  [name]
     * @returns {Number}
     */
    addToken: (token, name) => {
        // Get top token and if it's the same, ignore this call
        let top = Tokens.getTopToken();
        if (!top || top.t !== token) {
            let tokens = getStorageTokens();
            tokens.unshift({t: token, n: name || null});
            setStorageTokens(tokens);
        }

        return Tokens.getTokenCount();
    },

    /**
     * @param   {String}  token
     * @returns {Boolean}
     */
    setCurrentToken: token => {
        let tokens = getStorageTokens();
        if (tokens.length) {
            tokens[0].t = token;
            setStorageTokens(tokens);
            return true;
        }

        return false;
    },

    /**
     * @param   {String}  name
     * @returns {Boolean}
     */
    setCurrentName: name => {
        let tokens = getStorageTokens();
        if (tokens.length) {
            tokens[0].n = name;
            setStorageTokens(tokens);
            return true;
        }

        return false;
    },

    /**
     * @returns {Number}
     */
    dropTopToken: () => {
        let tokens = getStorageTokens();
        tokens.shift();
        setStorageTokens(tokens);
        return tokens.length;
    },

    /**
     *
     */
    clearTokens: () => {
        window.localStorage.removeItem(STORAGE_NAME);
    }

};

module.exports = Tokens;