import express                   from 'express';
import logger                    from '../shared/logging/WinstonLogger';
import GitlabManager             from '../managers/GitlabManager';
import DojoStatusCode            from '../shared/types/Dojo/DojoStatusCode';
import { StatusCodes }           from 'http-status-codes';
import { GitbeakerRequestError } from '@gitbeaker/requester-utils';
import * as Gitlab               from '@gitbeaker/rest';


class GlobalHelper {
    repoCreationFnExecCreator(req: express.Request, res: express.Response, gitlabError: DojoStatusCode, internalError: DojoStatusCode, repositoryToRemove?: Gitlab.ProjectSchema) {
        return async (toExec: () => Promise<unknown>, errorMessage?: string) => {
            try {
                return await toExec();
            } catch ( error ) {
                if ( errorMessage ) {
                    logger.error(errorMessage);
                    logger.error(JSON.stringify(error));

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

                    if ( error instanceof GitbeakerRequestError ) {
                        req.session.sendResponse(res, StatusCodes.INTERNAL_SERVER_ERROR, {}, `Unknown gitlab error: ${ errorMessage }`, gitlabError);
                        throw error;
                    }

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


export default new GlobalHelper();