/* eslint-env node */

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

const publicodesDir = path.resolve(__dirname, './règles')
const outDir = path.resolve(__dirname, './dist')

if (!fs.existsSync(outDir)) {
	fs.mkdirSync(outDir)
}

function concatenateFilesInDir(dirPath = publicodesDir) {
	return fs
		.readdirSync(dirPath)
		.map((filename) => {
			const fullpath = path.join(dirPath, filename)
			if (fs.statSync(fullpath).isDirectory()) {
				return concatenateFilesInDir(fullpath)
			} else {
				return filename.endsWith('.yaml') ? fs.readFileSync(fullpath) : ''
			}
		})
		.reduce((acc, cur) => acc + '\n' + cur, '')
}

function readRules() {
	return yaml.parse(concatenateFilesInDir())
}

// Note: we can't put the output file in the fs.watched directory

function writeJSFile() {
	const rules = readRules()
	const names = Object.keys(rules)
	const jsString = `module.exports = ${JSON.stringify(rules, null, 2)}`
	fs.writeFileSync(path.resolve(outDir, 'index.js'), jsString)
	fs.writeFileSync(
		path.resolve(outDir, 'names.ts'),
		`\nexport type Names = ${names.map((name) => `"${name}"`).join('\n  | ')}\n`
	)
}

writeJSFile()
exports.watchDottedNames = () => fs.watch(publicodesDir, writeJSFile)