'use strict';

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

/**
 * Формирует параметры сборки тестовых бандлов
 */
class TestBundler {

    /**
     * @param {Object} config - Настройки плаигна
     * @param {String} config.targetJsonPath - Путь для сохранения результата в JSON
     * @param {String} config.baseBundlePath - Папка, в которой нужно собирать бандлы
     * @param {Array} [config.devEntities=[]] - Дополнительные БЭМ-сущности, которые нужно добавить в декларацию каждого бандла
     * @param {Object} config.defaultBundleConfig - Содержимое по умолчанию
     * @param {String} [config.testTechnology=test.js] - Технология для файлов с тестами
     */
    constructor(config = {}) {
        this.config = config;
    }

    /**
     * Формирует результат для отдельного блока
     * @param {Object} blockData - Информация о блоке
     * @param {Object} blockData.techs - Технологии, в которых реализован блок (ключ - технология, значение - массив путей к файлам)
     * @param {Object} blockData.entities - БЭМ-сущности блока (ключ - ID БЭМ-сущности, значение - объект, аналогичный полю "techs", но для конкретной БЭМ-сущности)
     * @param {String} blockName - Название блока
     * @return {*}
     */
    eachBlock(blockData, blockName) {
        return Object.assign({}, this.config.defaultBundleConfig, {
            block: blockName,
            path: path.join(this.config.baseBundlePath, blockName),
            entities: [].concat(this.config.devEntities || []).concat(Object.keys(blockData.entities)),
            hasTests: !!blockData.techs[this.config.testTechnology || 'test.js']
        });
    }

    /**
     * Формирует общий результат для всех блоков
     * @param {Object[]} data - Массив объектов, полученных из метода "eachBlock"
     */
    allBlocks(data) {
        fs.writeFile(
            this.config.resultPath,
            JSON.stringify(data, null, 4),
            err => { err && console.log(err) }
        );
    }
}

module.exports = TestBundler;

@@ -698,24 +698,159 @@
 fig = %7B%7D) %7B%0A
+        config.testTechnology = config.testTechnology %7C%7C 'test.js';%0A        config.devEntities = %5B%5D.concat(config.devEntities %7C%7C %5B%5D);%0A%0A
         this
@@ -1585,26 +1585,16 @@
 tities: 
-%5B%5D.concat(
 this.con
@@ -1608,23 +1608,16 @@
 Entities
- %7C%7C %5B%5D)
 .concat(
@@ -1716,29 +1716,16 @@
 chnology
- %7C%7C 'test.js'
 %5D%0A      

fix test-bundler params