import express             from 'express';
import logger              from '../shared/logging/WinstonLogger';
import GitlabManager       from '../managers/GitlabManager';
import { AxiosError }      from 'axios';
import { StatusCodes }     from 'http-status-codes';
import DojoStatusCode      from '../shared/types/Dojo/DojoStatusCode';
import SharedGitlabManager from '../shared/managers/SharedGitlabManager';
import Config              from '../config/Config';
import * as Gitlab         from '@gitbeaker/rest';


class GlobalHelper {
    readonly sharedGitlabManager = new SharedGitlabManager(Config.gitlab.account.token);

    async repositoryCreationError(message: string, error: unknown, req: express.Request, res: express.Response, gitlabError: DojoStatusCode, internalError: DojoStatusCode, repositoryToRemove?: Gitlab.ProjectSchema): Promise<void> {
        logger.error(message);
        logger.error(error);

        try {
            if ( repositoryToRemove ) {
                await GitlabManager.deleteRepository(repositoryToRemove.id);
            }
        } catch ( deleteError ) {
            logger.error('Repository deletion error');
            logger.error(deleteError);
        }

        if ( error instanceof AxiosError ) {
            return req.session.sendResponse(res, StatusCodes.INTERNAL_SERVER_ERROR, {}, `Unknown gitlab error: ${ message }`, gitlabError);
        }

        return req.session.sendResponse(res, StatusCodes.INTERNAL_SERVER_ERROR, {}, `Unknown error: ${ message }`, internalError);
    }
}


export default new GlobalHelper();