const fs = require('fs');
const path = require('path');

const utils = require('../utils');

const FRONTEND_PATH = path.resolve(__dirname, '..', '..', 'front_end');

const modules = [];
for (let dir of fs.readdirSync(FRONTEND_PATH)) {
  if (!utils.isDir(path.resolve(FRONTEND_PATH, dir)))
    continue;
  let module = path.resolve(dir, 'module.json');
  if (utils.isFile(path.resolve(FRONTEND_PATH, dir, 'module.json')))
    modules.push(dir);
}

const Ajv = require('ajv');
const ajv = new Ajv({schemaId: 'id'});
// This seems to be the most widely supported version of the schema.
ajv.addMetaSchema(require('ajv/lib/refs/json-schema-draft-04.json'));

const schema = JSON.parse(fs.readFileSync(path.resolve(__dirname, 'module.schema.json')));
const validate = ajv.compile(schema);

let totalErrors = 0;
for (let module of modules) {
  const moduleObject = JSON.parse(fs.readFileSync(path.resolve(FRONTEND_PATH, module, 'module.json')));
  const valid = validate(moduleObject);
  if (!valid) {
    console.log('Issue with ./front_end/' + module + '/module.json:');
    totalErrors++;
    validate.errors.sort((a, b) => b.dataPath.length - a.dataPath.length);
    const error = validate.errors[0];
    console.log('  ', error.dataPath, error.message, error.params);
    console.log('');
  }
}
if (totalErrors)
  console.log('module.json errors:', totalErrors);
process.exit(totalErrors);
