import fs                  from 'fs-extra';
import path                from 'path';
import GitlabManager       from '../managers/GitlabManager';
import ClientsSharedConfig from '../sharedByClients/config/ClientsSharedConfig';


class Config {
    public gitlabManager!: GitlabManager;

    public appName!: string;

    public folders!: {
        project: string; resultsVolume: string; resultsDojo: string; resultsExercise: string;
    };

    public dockerhub!: {
        repositories: {
            assignmentChecker: string
        }
    };

    constructor() { }

    async init() {
        const apiUrl = process.env.API_URL ?? '';

        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.appName = getEnvVar('APP_NAME', '');

        this.folders = {
            project        : getEnvVar('PROJECT_FOLDER', './').convertWithEnvVars(),
            resultsVolume  : getEnvVar('EXERCISE_RESULTS_VOLUME', '').convertWithEnvVars(),
            resultsDojo    : path.join(getEnvVar('EXERCISE_RESULTS_VOLUME', '').convertWithEnvVars(), 'Dojo/'),
            resultsExercise: path.join(getEnvVar('EXERCISE_RESULTS_VOLUME', '').convertWithEnvVars(), 'Exercise/')
        };
        this.resetResultsVolume();

        this.dockerhub = {
            repositories: {
                assignmentChecker: getEnvVar('DOCKERHUB_ASSIGNMENT_CHECKER_REPOSITORY', '')
            }
        };
    }

    private resetResultsVolume(): void {
        fs.emptyDirSync(this.folders.resultsVolume);
        fs.emptyDirSync(this.folders.resultsDojo);
        fs.emptyDirSync(this.folders.resultsExercise);
    }
}


export default new Config();