import { Command, Option } from 'commander';
import Config              from '../config/Config.js';
import SessionManager      from '../managers/SessionManager.js';
import TextStyle           from '../types/TextStyle.js';
import ora                 from 'ora';
import DojoBackendManager  from '../managers/DojoBackendManager.js';
import Assignment          from '../sharedByClients/models/Assignment.js';


class GlobalHelper {
    public runCommandDefinition(command: Command) {
        command
            .option('-p, --path <value>', 'assignment path', Config.folders.defaultLocalExercise)
            .option('-v, --verbose', 'verbose mode - display principal container output in live')
            .addOption(new Option('-w, --super-verbose', 'verbose mode - display all docker compose logs (build included) in live').conflicts('verbose'))
            .addOption(new Option('--verbose-ssj2').hideHelp().implies({ superVerbose: true }));

        return command;
    }


    public readonly refreshGitlabTokenFunction = async () => {
        await SessionManager.refreshTokens();

        return SessionManager.gitlabCredentials.accessToken ?? '';
    };


    public async checkAssignmentCorrectionAccess(assignmentName: string): Promise<Assignment | undefined> {
        console.log(TextStyle.BLOCK('Please wait while we check access...'));

        const assignmentGetSpinner: ora.Ora = ora('Checking if assignment exists').start();
        const assignment = await DojoBackendManager.getAssignment(assignmentName);
        if ( !assignment ) {
            assignmentGetSpinner.fail(`The assignment doesn't exists`);
            return undefined;
        }
        assignmentGetSpinner.succeed(`The assignment exists`);


        const assignmentAccessSpinner: ora.Ora = ora('Checking assignment access').start();
        if ( assignment.staff.find(staff => staff.id === SessionManager.profile?.id) === undefined ) {
            assignmentAccessSpinner.fail(`You are not in the staff of the assignment`);
            return undefined;
        }
        assignmentAccessSpinner.succeed(`You are in the staff of the assignment`);

        return assignment;
    }
}


export default new GlobalHelper();