const yaml = require('js-yaml');
const fs = require('fs');
const path = require('path');
const Ajv = require('ajv');
const { compile } = require('json-schema-to-typescript');
const { ESLint } = require('eslint');

const ajv = new Ajv();
const eslint = new ESLint({ fix: true });

const YamlPath = path.resolve(__dirname, '../schemas/schema.yml');
const JsonPath = path.resolve(__dirname, '../src/validate/schema.json');
const tsPath = path.resolve(__dirname, '../src/core/schema/types.ts');
// Get document, or throw exception on error

(async function () {
  try {
    const schema = yaml.load(fs.readFileSync(YamlPath, 'utf8'));
    ajv.compile(schema);
    fs.writeFileSync(JsonPath, JSON.stringify(schema, null, 2), 'utf-8');
    console.log('yaml file is successfully transformed into json');
    const ts = await compile(schema, 'ComponentMeta');
    fs.writeFileSync(tsPath, ts);
    // Lint files. This doesn't modify target files.
    const results = await eslint.lintFiles([tsPath]);

    // Modify the files with the fixed code.
    await ESLint.outputFixes(results);

    console.log('schema/types.d.ts is successfully generated');
  } catch (e) {
    console.log(e);
    process.exit(1);
  }
})();