//
// Created by Alan-Michael Moody on 4/17/2017
//

(function () {
    var barID, textID, originalText;

    this.preload = function (entityID) {

        var children = Entities.getChildrenIDs(entityID);
        var childZero = Entities.getEntityProperties(children[0]);
        var childOne = Entities.getEntityProperties(children[1]);
        var childZeroUserData = JSON.parse(Entities.getEntityProperties(children[0]).userData);

        if (childZeroUserData.name === "bar") {
            barID = childZero.id;
            textID = childOne.id;
            originalText = childOne.text
        } else {
            barID = childOne.id;
            textID = childZero.id;
            originalText = childZero.text;
        }
    };

    var SCAN_RATE = 100; //ms
    var REFERENCE_FRAME_COUNT = 30;
    var MAX_AUDIO_THRESHOLD = 16000;

    var framePool = [];

    function scanEngine() {
        var avatarLoudnessPool = [];

        function average(a) {
            var sum = 0;
            var total = a.length;
            for (var i = 0; i < total; i++) {
                sum += a[i];
            }
            return Math.round(sum / total);
        }

        function audioClamp(input) {
            if (input > MAX_AUDIO_THRESHOLD) return MAX_AUDIO_THRESHOLD;
            return input;
        }


        var avatars = AvatarList.getAvatarIdentifiers();
        avatars.forEach(function (id) {
            var avatar = AvatarList.getAvatar(id);
            avatarLoudnessPool.push(audioClamp(Math.round(avatar.audioLoudness)));
        });


        framePool.push(average(avatarLoudnessPool));
        if (framePool.length >= REFERENCE_FRAME_COUNT) {
            framePool.shift();
        }

        function normalizedAverage(a) {
            a = a.map(function (v) {
                return Math.round(( 100 / MAX_AUDIO_THRESHOLD ) * v);
            });
            return average(a);
        }

        var norm = normalizedAverage(framePool);
        Entities.editEntity(textID, {text: originalText + " % " + norm});

        var barProperties = Entities.getEntityProperties(barID);

        var colorShift = 2.55 * norm; //shifting the scale to 0 - 255
        var xShift = norm / 52; // changing scale from 0-100 to 0-1.9 ish
        var normShift = xShift - 0.88; //shifting local displacement (-0.88)
        var halfShift = xShift / 2;
        Entities.editEntity(barID, {
            dimensions: {x: xShift, y: barProperties.dimensions.y, z: barProperties.dimensions.z},
            localPosition: {x: normShift - ( halfShift ), y: -0.0625, z: -0.015},
            color: {red: colorShift, green: barProperties.color.green, blue: barProperties.color.blue}
        });
    }

    Script.setInterval(function () {
        scanEngine();
    }, SCAN_RATE);

});