import CommanderCommand from '../../CommanderCommand';
import chalk from 'chalk';
import ora from 'ora';
import DojoBackendManager from '../../../managers/DojoBackendManager';
import Result from '../../../sharedByClients/models/Result';
import inquirer from 'inquirer';


class ExerciseResultCommand extends CommanderCommand {
    protected commandName: string = 'result';

    protected defineCommand(): void {
        this.command
            .description('results of an exercise')
            .argument('<idOrLink>', 'display results of a specific exercise by Id or Gitlab Link')
            .action(this.commandAction.bind(this));
    }

    protected async commandAction(idOrLink: string): Promise<void> {
        const spinner = ora('Fetching exercise results...').start();

        try {
            const exerciseId = this.extractExerciseId(idOrLink);
            // console.log('Exercise ID:', exerciseId);
            spinner.info(`Fetching results for exercise with ID: ${exerciseId}`);
            const results = await DojoBackendManager.getExerciseResults(exerciseId);

            if (!results) {
                spinner.info('No results found for this exercise.');
                spinner.succeed('Exercise results fetched successfully.');
                return;
            }

            if (results.length === 0) {
                spinner.info('No results found for this exercise.');
            } else {
                const answer = await inquirer.prompt([
                    {
                        type: 'list',
                        name: 'testType',
                        message: 'Choisissez le type de tests à afficher:',
                        choices: ['Tests réussis', 'Tests échoués', 'Les deux'],
                    }
                ]);

                const { testType } = answer;

                this.displayResults(results, testType);
                spinner.succeed('Exercise results fetched successfully.');
            }
        } catch (error) {
            spinner.fail('Error fetching exercise results.');
            console.error(error);
        }
    }

    private extractExerciseId(idOrLink: string): string {
        if (idOrLink.length <= 36) {
            return idOrLink;
        } else {
            const lastUnderscoreIndex = idOrLink.lastIndexOf('_');
            // console.log('Last underscore index:', lastUnderscoreIndex);
            if (lastUnderscoreIndex !== -1) { // -1 = pas de underscore trouvé
                return idOrLink.substring(lastUnderscoreIndex + 1); // Extrait la sous-chaîne après le dernier underscore dans idOrLink
            } else {
                return '';
            }
        }
    }

    private displayResults(results: Result[], testType: string): void {
        if (!results || results.length === 0) {
            console.log('No results to display.');
            return;
        }

        // Filtrer les résultats en fonction du type de test choisi
        const filteredResults = results.filter(result => {
            if (testType === 'Tests réussis') {
                return result.success;
            } else if (testType === 'Tests échoués') {
                return !result.success;
            }
            return true; // 'Les deux' ou autre
        });

        if (filteredResults.length === 0) {
            console.log('No results to display for the selected test type.');
            return;
        }

        filteredResults.forEach(result => {
            console.log(chalk.magenta(`Résultats de l\`exercice : ${result.exerciseId}`));
            console.log(`  - Date et heure : ${result.dateTime}`);
            console.log(`  - Succès : ${result.success ? chalk.green('Oui') : chalk.red('Non')}`);
            console.log('  - Détails des résultats :');
            console.log(`    - Tests réussis : ${result.results.successfulTests}`);
            console.log(`    - Tests échoués : ${result.results.failedTests}`);

            if (testType === 'Tests réussis' || testType === 'Les deux') {
                console.log('    - Liste des tests réussis :');
                if (Array.isArray(result.results.successfulTestsList)) {
                    result.results.successfulTestsList.forEach((test: string) => {
                        console.log(`      - ${test} ${chalk.green('\u2713')}`);
                    });
                }
            }

            if (testType === 'Tests échoués' || testType === 'Les deux') {
                console.log('    - Liste des tests échoués :');
                if (Array.isArray(result.results.failedTestsList)) {
                    result.results.failedTestsList.forEach((test: string) => {
                        console.log(`      - ${test} ${chalk.red('\u2717')}`);
                    });
                }
            }

            console.log('-----------------------------------');
        });
    }
}
export default new ExerciseResultCommand();