'use strict';

// Core modules
const { join } = require('path');

/**
 * Class containing variables shared between modules.
 */
class Shared {
    //#region Properties
    /**
     * Shows log messages and other useful functions for module debugging.
     * @type Boolean
     */
    static _debug = false;
    /**
     * Indicates whether a user is logged in to the F95Zone platform or not.
     * @type Boolean
     */
    static _isLogged = false;
    /**
     * List of cookies obtained from the F95Zone platform.
     * @type Object[]
     */
    static _cookies = null;
    /**
     * List of possible game engines used for development.
     * @type String[]
     */
    static _engines = null;
    /**
     * List of possible development statuses that a game can assume.
     * @type String[]
     */
    static _statuses = null;
    /**
     * Wait instruction for the browser created by puppeteer.
     * @type String
     */
    static WAIT_STATEMENT = 'domcontentloaded';
    /**
     * Path to the directory to save the cache generated by the API.
     * @type String
     */
    static _cacheDir = './f95cache';
    /**
     * If true, it opens a new browser for each request to 
     * the F95Zone platform, otherwise it reuses the same.
     * @type Boolean
     */
    static _isolation = false;
    //#endregion Properties

    //#region Getters
    /**
     * Shows log messages and other useful functions for module debugging.
     * @returns {Boolean}
     */
    static get debug() {
        return this._debug;
    }
    /**
     * @returns {boolean}
     */
    static get isLogged() {
        return this._isLogged;
    }
    /**
     * @returns {object[]}
     */
    static get cookies() {
        return this._cookies;
    }
    /**
     * @returns {String[]}
     */
    static get engines() {
        return this._engines;
    }
    /**
     * @returns {String[]}
     */
    static get statuses() {
        return this._statuses;
    }
    /**
     * Directory to save the API cache.
     * @returns {String}
     */
    static get cacheDir() {
        return this._cacheDir;
    }
    /**
     * Path to the F95 platform cache.
     * @returns {String}
     */
    static get cookiesCachePath() {
        return join(this._cacheDir, 'cookies.json');
    }
    /**
     * Path to the game engine cache.
     * @returns {String}
     */
    static get enginesCachePath() {
        return join(this._cacheDir, 'engines.json');
    }
    /**
     * Path to the cache of possible game states.
     * @returns {String}
     */
    static get statusesCachePath() {
        return join(this._cacheDir, 'statuses.json');
    }
    /**
     * If true, it opens a new browser for each request 
     * to the F95Zone platform, otherwise it reuses the same.
     * @returns {Boolean}
     */
    static get isolation() {
        return this._isolation;
    }
    //#endregion Getters

    //#region Setters
    static set cookies(val) {
        this._cookies = val;
    }

    static set engines(val) {
        this._engines = val;
    }

    static set statuses(val) {
        this._statuses = val;
    }

    static set cacheDir(val) {
        this._cacheDir = val;
    }

    static set debug(val) {
        this._debug = val;
    }

    static set isLogged(val) {
        this._isLogged = val;
    }

    static set isolation(val) {
        this._isolation = val;
    }
    //#endregion Setters
}

module.exports = Shared;