import Ajv, { ErrorObject, JTDSchemaType } from 'ajv/dist/jtd';
import fs                                  from 'fs';
import ExerciceResultsFile                 from '../types/Dojo/ExerciceResultsFile';
import JSON5                               from 'json5';


class ExerciceHelper {
    validateResultFile(resultsFilePathOrStr: string, isFile: boolean = true): { results: ExerciceResultsFile | undefined, isValid: boolean, errors: Array<ErrorObject<string, Record<string, any>, unknown> | string> | null | undefined } {
        const ajv = new Ajv();

        const schema: JTDSchemaType<ExerciceResultsFile> = {
            properties          : {
                success: { type: 'boolean' }
            },
            optionalProperties  : {
                successfulTests: { type: 'uint32' },
                failedTests    : { type: 'uint32' },

                successfulTestsList: {
                    elements: {
                        type: 'string'
                    }
                },
                failedTestsList    : {
                    elements: {
                        type: 'string'
                    }
                }
            },
            additionalProperties: false
        };

        const validator = ajv.compile(schema);

        try {
            const results = JSON5.parse(isFile ? fs.readFileSync(resultsFilePathOrStr, 'utf8') : resultsFilePathOrStr);
            const isValid = validator(results);

            return {
                results: isValid ? results as ExerciceResultsFile : results as any,
                isValid: isValid,
                errors : validator.errors
            };
        } catch ( error ) {
            return {
                results: undefined,
                isValid: false,
                errors : [ `JSON5 invalid : ${ JSON.stringify(error) }` ]
            };
        }
    }
}


export default new ExerciceHelper();