'use strict';

const path = require('path');
const glob = require('glob');
const fs = require('fs');
const slash = require('slash');
const parseRefTest = require('./parse-reftest');
const outputPath = 'tests/reftests.js';

const ignoredTests = fs
    .readFileSync(path.resolve(__dirname, `../tests/reftests/ignore.txt`))
    .toString()
    .split(/\r\n|\r|\n/)
    .filter(l => l.length)
    .reduce((acc, l) => {
        const m = l.match(/^(\[(.+)\])?(.+)$/i);
        acc[m[3]] = m[2] ? m[2].split(',') : [];
        return acc;
    }, {});

glob(
    '../tests/reftests/**/*.html',
    {
        cwd: __dirname,
        root: path.resolve(__dirname, '../../')
    },
    (err, files) => {
        if (err) {
            console.error(err);
            process.exit(1);
        }

        const testList = files.reduce((acc, filename) => {
            const refTestFilename = path.resolve(__dirname, filename.replace(/\.html$/, '.txt'));
            const name = `/${slash(path.relative('../', filename))}`;
            if (!Array.isArray(ignoredTests[name]) || ignoredTests[name].length) {
                acc[name] = fs.existsSync(refTestFilename)
                    ? parseRefTest(fs.readFileSync(refTestFilename).toString())
                    : null;
            } else {
                console.log(`IGNORED: ${name}`);
            }

            return acc;
        }, {});
        fs.writeFileSync(
            path.resolve(__dirname, `../${outputPath}`),
            `module.exports = ${JSON.stringify({testList, ignoredTests}, null, 4)};`
        );

        console.log(`${outputPath} updated`);
    }
);