// Read from the .env file
// ATTENTION : These lines MUST be the first of this file (except for the path import)
import path = require('node:path');
import myEnv = require('dotenv');
import dotenvExpand = require('dotenv-expand');


dotenvExpand.expand(myEnv.config({
                                     path      : path.join(__dirname, '../.env'),
                                     DOTENV_KEY: 'dotenv://:key_f1778b6998874f6fd78c716ccef982c5595fa300f174b129eafc88ba7044d69b@dotenv.local/vault/.env.vault?environment=development'
                                 }));

require('./shared/helpers/TypeScriptExtensions'); // ATTENTION : This line MUST be the second of this file


import ClientsSharedAssignmentHelper from './sharedByClients/helpers/Dojo/ClientsSharedAssignmentHelper';
import AssignmentValidator           from './sharedByClients/helpers/Dojo/AssignmentValidator';
import Styles                        from './types/Style';
import HttpManager                   from './managers/HttpManager';
import Config                        from './config/Config';
import Icon                          from './shared/types/Icon';


(async () => {
    HttpManager.registerAxiosInterceptor();

    console.log(Styles.APP_NAME(`${ Config.appName } (version {{VERSION}})`));

    const assignmentValidator = new AssignmentValidator(Config.folders.project);

    try {
        await new Promise<void>((resolve, reject) => {
            assignmentValidator.events.on('step', (_name: string, message: string) => {
                console.log(Styles.CAT_INFO(`${ Icon.CAT_INFO } ${ message }`));
            });

            assignmentValidator.events.on('subStep', (_name: string, message: string) => {
                console.log(Styles.INFO(`\t${ Icon.INFO } ${ message }`));
            });

            assignmentValidator.events.on('endSubStep', (_stepName: string, message: string, error: boolean) => {
                if ( error ) {
                    console.error(Styles.ERROR(`\t${ Icon.ERROR } ${ message }`));
                }
            });

            assignmentValidator.events.on('finished', (success: boolean) => {
                success ? resolve() : reject();
            });

            assignmentValidator.run();
        });
    } catch ( error ) { /* empty */ }

    ClientsSharedAssignmentHelper.displayExecutionResults(assignmentValidator, `The assignment is ready to be published.`, Styles);

    process.exit(assignmentValidator.exitCode);
})();