const es = require('event-stream');
const fs = require('fs');
const path = require('path');
const assert = require('assert');

// Storage object
const storage = {};

// File paths
const PATH_INPUT = path.resolve(__dirname, '../msg/messages.js');
const PATH_OUTPUT = path.resolve(__dirname, '../msg/json/en.json');

// Match function
const match = function (str) {
    if (str.indexOf('Blockly.Msg.') !== 0) return false;
    assert.notStrictEqual(str.indexOf('";'), str.length - 2, `[${str}] uses double quoted string, should use single quotes.`);
    if (str.indexOf("';") !== str.length - 2) return false;
    return true;
}

// Extract key and value from message definition
const extract = function (str) {
    str = str.split('Blockly.Msg.')[1].split(' ');
    return {
        key: str[0],
        value: str
            .splice(2, str.length)
            .join(' ')
            .slice(1, -2) // strip off initial ', and ending ';
            .replace(/\\'/g, "'")
    };
};

// Stream input and push each match to the storage object
const stream = fs.createReadStream(PATH_INPUT);
stream
    .pipe(es.split('\n'))
    .pipe(es.mapSync(function (str) {
        if (!match(str)) return;
        const result = extract(str);
        storage[result.key] = result.value;
    }))
    .pipe(es.wait(function (err) {
        if (err) throw new Error(err);
        fs.writeFileSync(PATH_OUTPUT, JSON.stringify(storage, null, 4));
    }));