var LEFT_HAND_INDEX = 0;
var RIGHT_HAND_INDEX = 1;
var LEFT_FOOT_INDEX = 2;
var RIGHT_FOOT_INDEX = 3;
var HIPS_INDEX = 4;
var SPINE2_INDEX = 5;

var mappingJson = {
    name: "com.highfidelity.testing.accelerationTest",
    channels: [
        {
            from: "Standard.LeftHand",
            to: "Actions.LeftHand",
            filters: [
                {
                    type: "accelerationLimiter",
                    rotationAccelerationLimit: 2000.0,
                    translationAccelerationLimit: 100.0,
                }
            ]
        },
        {
            from: "Standard.RightHand",
            to: "Actions.RightHand",
            filters: [
                {
                    type: "accelerationLimiter",
                    rotationAccelerationLimit: 2000.0,
                    translationAccelerationLimit: 100.0,
                }
            ]
        },
        {
            from: "Standard.LeftFoot",
            to: "Actions.LeftFoot",
            filters: [
                {
                    type: "accelerationLimiter",
                    rotationAccelerationLimit: 2000.0,
                    translationAccelerationLimit: 100.0,
                }
            ]
        },
        {
            from: "Standard.RightFoot",
            to: "Actions.RightFoot",
            filters: [
                {
                    type: "accelerationLimiter",
                    rotationAccelerationLimit: 2000.0,
                    translationAccelerationLimit: 100.0,
                }
            ]
        },
        {
            from: "Standard.Hips",
            to: "Actions.Hips",
            filters: [
                {
                    type: "accelerationLimiter",
                    rotationAccelerationLimit: 2000.0,
                    translationAccelerationLimit: 100.0,
                }
            ]
        },
        {
            from: "Standard.Spine2",
            to: "Actions.Spine2",
            filters: [
                {
                    type: "accelerationLimiter",
                    rotationAccelerationLimit: 2000.0,
                    translationAccelerationLimit: 100.0,
                }
            ]
        }
    ]
};

//
// tablet app boiler plate
//

var TABLET_BUTTON_NAME = "ACCFILT";
var HTML_URL = Script.getExternalPath(Script.ExternalPaths.HF_Public, "/tony/html/accelerationFilterApp.html?2");

var tablet = Tablet.getTablet("com.highfidelity.interface.tablet.system");
var tabletButton = tablet.addButton({
    text: TABLET_BUTTON_NAME,
    icon: Script.getExternalPath(Script.ExternalPaths.HF_Public, "/tony/icons/tpose-i.svg"),
    activeIcon: Script.getExternalPath(Script.ExternalPaths.HF_Public, "/tony/icons/tpose-a.svg")
});

tabletButton.clicked.connect(function () {
    if (shown) {
        tablet.gotoHomeScreen();
    } else {
        tablet.gotoWebScreen(HTML_URL);
    }
});

var shown = false;

function onScreenChanged(type, url) {
    if (type === "Web" && url === HTML_URL) {
        tabletButton.editProperties({isActive: true});
        if (!shown) {
            // hook up to event bridge
            tablet.webEventReceived.connect(onWebEventReceived);
            shownChanged(true);
        }
        shown = true;
    } else {
        tabletButton.editProperties({isActive: false});
        if (shown) {
            // disconnect from event bridge
            tablet.webEventReceived.disconnect(onWebEventReceived);
            shownChanged(false);
        }
        shown = false;
    }
}

function getTranslationAccelerationLimit(i) {
    return mappingJson.channels[i].filters[0].translationAccelerationLimit;
}
function setTranslationAccelerationLimit(i, value) {
    mappingJson.channels[i].filters[0].translationAccelerationLimit = value;
    mappingChanged();
}
function getRotationAccelerationLimit(i) {
    return mappingJson.channels[i].filters[0].rotationAccelerationLimit;
}
function setRotationAccelerationLimit(i, value) {
    mappingJson.channels[i].filters[0].rotationAccelerationLimit = value; mappingChanged();
}

function onWebEventReceived(msg) {
    if (msg.name === "init-complete") {
        var values = [
            {name: "left-hand-translation-acceleration-limit", val: getTranslationAccelerationLimit(LEFT_HAND_INDEX), checked: false},
            {name: "left-hand-rotation-acceleration-limit", val: getRotationAccelerationLimit(LEFT_HAND_INDEX), checked: false},
            {name: "right-hand-translation-acceleration-limit", val: getTranslationAccelerationLimit(RIGHT_HAND_INDEX), checked: false},
            {name: "right-hand-rotation-acceleration-limit", val: getRotationAccelerationLimit(RIGHT_HAND_INDEX), checked: false},
            {name: "left-foot-translation-acceleration-limit", val: getTranslationAccelerationLimit(LEFT_FOOT_INDEX), checked: false},
            {name: "left-foot-rotation-acceleration-limit", val: getRotationAccelerationLimit(LEFT_FOOT_INDEX), checked: false},
            {name: "right-foot-translation-acceleration-limit", val: getTranslationAccelerationLimit(RIGHT_FOOT_INDEX), checked: false},
            {name: "right-foot-rotation-acceleration-limit", val: getRotationAccelerationLimit(RIGHT_FOOT_INDEX), checked: false},
            {name: "hips-translation-acceleration-limit", val: getTranslationAccelerationLimit(HIPS_INDEX), checked: false},
            {name: "hips-rotation-acceleration-limit", val: getRotationAccelerationLimit(HIPS_INDEX), checked: false},
            {name: "spine2-translation-acceleration-limit", val: getTranslationAccelerationLimit(SPINE2_INDEX), checked: false},
            {name: "spine2-rotation-acceleration-limit", val: getRotationAccelerationLimit(SPINE2_INDEX), checked: false}
        ];
        tablet.emitScriptEvent(JSON.stringify(values));
    } else if (msg.name === "left-hand-translation-acceleration-limit") {
        setTranslationAccelerationLimit(LEFT_HAND_INDEX, parseInt(msg.val, 10));
    } else if (msg.name === "left-hand-rotation-acceleration-limit") {
        setRotationAccelerationLimit(LEFT_HAND_INDEX, parseInt(msg.val, 10));
    } else if (msg.name === "right-hand-translation-acceleration-limit") {
        setTranslationAccelerationLimit(RIGHT_HAND_INDEX, parseInt(msg.val, 10));
    } else if (msg.name === "right-hand-rotation-acceleration-limit") {
        setRotationAccelerationLimit(RIGHT_HAND_INDEX, parseInt(msg.val, 10));
    } else if (msg.name === "left-foot-translation-acceleration-limit") {
        setTranslationAccelerationLimit(LEFT_FOOT_INDEX, parseInt(msg.val, 10));
    } else if (msg.name === "left-foot-rotation-acceleration-limit") {
        setRotationAccelerationLimit(LEFT_FOOT_INDEX, parseInt(msg.val, 10));
    } else if (msg.name === "right-foot-translation-acceleration-limit") {
        setTranslationAccelerationLimit(RIGHT_FOOT_INDEX, parseInt(msg.val, 10));
    } else if (msg.name === "right-foot-rotation-acceleration-limit") {
        setRotationAccelerationLimit(RIGHT_FOOT_INDEX, parseInt(msg.val, 10));
    } else if (msg.name === "hips-translation-acceleration-limit") {
        setTranslationAccelerationLimit(HIPS_INDEX, parseInt(msg.val, 10));
    } else if (msg.name === "hips-rotation-acceleration-limit") {
        setRotationAccelerationLimit(HIPS_INDEX, parseInt(msg.val, 10));
    } else if (msg.name === "spine2-translation-acceleration-limit") {
        setTranslationAccelerationLimit(SPINE2_INDEX, parseInt(msg.val, 10));
    } else if (msg.name === "spine2-rotation-acceleration-limit") {
        setRotationAccelerationLimit(SPINE2_INDEX, parseInt(msg.val, 10));
    }
}

tablet.screenChanged.connect(onScreenChanged);

function shutdownTabletApp() {
    tablet.removeButton(tabletButton);
    if (shown) {
        tablet.webEventReceived.disconnect(onWebEventReceived);
        tablet.gotoHomeScreen();
    }
    tablet.screenChanged.disconnect(onScreenChanged);
}

//
// end tablet app boiler plate
//

var mapping;
function mappingChanged() {
    if (mapping) {
        mapping.disable();
    }
    mapping = Controller.parseMapping(JSON.stringify(mappingJson));
    mapping.enable();
}

function shownChanged(newShown) {
    if (newShown) {
        mappingChanged();
    } else {
        mapping.disable();
    }
}

mappingChanged();

Script.scriptEnding.connect(function() {
    if (mapping) {
        mapping.disable();
    }
    tablet.removeButton(tabletButton);
});