import ClientsSharedConfig from '../sharedByClients/config/ClientsSharedConfig';
import GitlabManager       from '../managers/GitlabManager';


class Config {
    public gitlabManager!: GitlabManager;

    public versionUpdateInformationPeriodHours!: number;

    public gitlab!: {
        cliReleasePage: string
        cliPreAlphaReleasePage: string
    };

    public login!: {
        server: {
            port: number, route: string
        }, gitlab: {
            url: {
                code: string
            }
        }
    };

    public folders!: {
        defaultLocalExercise: string
    };

    public exercise!: {
        neededFiles: Array<string>
    };

    public interactiveMode!: boolean;

    constructor() { }

    async init(apiUrl: string) {
        await ClientsSharedConfig.init(apiUrl);
        const getEnvVar = ClientsSharedConfig.envVarGetter();

        this.gitlabManager = new GitlabManager(ClientsSharedConfig.gitlab.URL, ClientsSharedConfig.login.gitlab.client.id, ClientsSharedConfig.login.gitlab.url.redirect, ClientsSharedConfig.login.gitlab.url.token);

        this.versionUpdateInformationPeriodHours = Number(getEnvVar('VERSION_UPDATE_INFORMATION_PERIOD_HOURS', '24'));

        this.gitlab = {
            cliReleasePage        : getEnvVar('GITLAB_CLI_RELEASE_PAGE', ''),
            cliPreAlphaReleasePage: getEnvVar('GITLAB_CLI_PREALPHA_RELEASE_PAGE', '')
        };

        this.login = {
            server: {
                port : Number(getEnvVar('LOGIN_SERVER_PORT', '30992')),
                route: getEnvVar('LOGIN_SERVER_ROUTE', '')
            },
            gitlab: {
                url: {
                    code: getEnvVar('LOGIN_GITLAB_URL_CODE', '')
                }
            }
        };

        this.folders = {
            defaultLocalExercise: getEnvVar('LOCAL_EXERCISE_DEFAULT_FOLDER', './')
        };

        this.exercise = {
            neededFiles: JSON.parse(getEnvVar('EXERCISE_NEEDED_FILES', '[]'))
        };

        this.interactiveMode = getEnvVar('INTERACTIVE_MODE', 'false') === 'true';
    }
}


export default new Config();