import AssignmentFile       from '../../types/Dojo/AssignmentFile';
import DojoStatusCode       from '../../types/Dojo/DojoStatusCode';
import Json5FileValidator   from '../Json5FileValidator';
import * as Gitlab          from '@gitbeaker/rest';
import GitlabPipelineStatus from '../../types/Gitlab/GitlabPipelineStatus';
import GlobalHelper         from '../../../helpers/GlobalHelper';


class SharedAssignmentHelper {
    validateDescriptionFile(filePathOrStr: string, isFile: boolean = true, version: number = 1): { content: AssignmentFile | undefined, isValid: boolean, error: string | null } {
        if ( version === 1 ) {
            return Json5FileValidator.validateFile(AssignmentFile, filePathOrStr, isFile);
        } else {
            return {
                content: undefined,
                isValid: false,
                error  : `Version ${ version } not supported`
            };
        }
    }

    async isPublishable(repositoryId: number): Promise<{ isPublishable: boolean, lastPipeline: Gitlab.PipelineSchema | null, status?: { code: DojoStatusCode, message: string } }> {
        const pipelines = await GlobalHelper.sharedGitlabManager.getRepositoryPipelines(repositoryId, 'main');
        if ( pipelines.length > 0 ) {
            const lastPipeline = pipelines[0];
            if ( lastPipeline.status != GitlabPipelineStatus.SUCCESS.valueOf() ) {
                return {
                    isPublishable: false,
                    lastPipeline : lastPipeline,
                    status       : {
                        code   : DojoStatusCode.ASSIGNMENT_PUBLISH_PIPELINE_FAILED,
                        message: `Last pipeline status is not "${ GitlabPipelineStatus.SUCCESS }" but "${ lastPipeline.status }".`
                    }
                };
            } else {
                return {
                    isPublishable: true,
                    lastPipeline : lastPipeline
                };
            }
        } else {
            return {
                isPublishable: false,
                lastPipeline : null,
                status       : {
                    code   : DojoStatusCode.ASSIGNMENT_PUBLISH_NO_PIPELINE,
                    message: 'No pipeline found for this assignment.'
                }
            };
        }
    }
}


export default new SharedAssignmentHelper();