const tap = require('tap');
const Target = require('../../src/engine/target');
const Runtime = require('../../src/engine/runtime');
const VariableUtil = require('../../src/util/variable-util');

let target1;
let target2;

tap.beforeEach(() => {
    const runtime = new Runtime();
    target1 = new Target(runtime);
    target1.blocks.createBlock({
        id: 'a block',
        fields: {
            VARIABLE: {
                id: 'id1',
                value: 'foo'
            }
        }
    });
    target1.blocks.createBlock({
        id: 'another block',
        fields: {
            TEXT: {
                value: 'not a variable'
            }
        }
    });

    target2 = new Target(runtime);
    target2.blocks.createBlock({
        id: 'a different block',
        fields: {
            VARIABLE: {
                id: 'id2',
                value: 'bar'
            }
        }
    });
    target2.blocks.createBlock({
        id: 'another var block',
        fields: {
            VARIABLE: {
                id: 'id1',
                value: 'foo'
            }
        }
    });

    return Promise.resolve(null);
});

const test = tap.test;

test('get all var refs', t => {
    const allVarRefs = VariableUtil.getAllVarRefsForTargets([target1, target2]);
    t.equal(Object.keys(allVarRefs).length, 2);
    t.equal(allVarRefs.id1.length, 2);
    t.equal(allVarRefs.id2.length, 1);
    t.equal(allVarRefs['not a variable'], undefined);

    t.end();
});

test('merge variable ids', t => {
    // Redo the id for the variable with 'id1'
    VariableUtil.updateVariableIdentifiers(target1.blocks.getAllVariableAndListReferences().id1, 'renamed id');
    const varField = target1.blocks.getBlock('a block').fields.VARIABLE;
    t.equals(varField.id, 'renamed id');
    t.equals(varField.value, 'foo');

    t.end();
});

test('merge variable ids but with new name too', t => {
    // Redo the id for the variable with 'id1'
    VariableUtil.updateVariableIdentifiers(target1.blocks.getAllVariableAndListReferences().id1, 'renamed id', 'baz');
    const varField = target1.blocks.getBlock('a block').fields.VARIABLE;
    t.equals(varField.id, 'renamed id');
    t.equals(varField.value, 'baz');

    t.end();
});