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 HAND_SMOOTHING_TRANSLATION = 0.3;
var HAND_SMOOTHING_ROTATION = 0.15;
var FOOT_SMOOTHING_TRANSLATION = 0.3;
var FOOT_SMOOTHING_ROTATION = 0.15;
var TORSO_SMOOTHING_TRANSLATION = 0.3;
var TORSO_SMOOTHING_ROTATION = 0.16;

var mappingJson = {
    name: "com.highfidelity.testing.exponentialFilterApp",
    channels: [
        {
            from: "Standard.LeftHand",
            to: "Actions.LeftHand",
            filters: [
                {
                    type: "exponentialSmoothing",
                    translation: HAND_SMOOTHING_TRANSLATION,
                    rotation: HAND_SMOOTHING_ROTATION
                }
            ]
        },
        {
            from: "Standard.RightHand",
            to: "Actions.RightHand",
            filters: [
                {
                    type: "exponentialSmoothing",
                    translation: HAND_SMOOTHING_TRANSLATION,
                    rotation: HAND_SMOOTHING_ROTATION
                }
            ]
        },
        {
            from: "Standard.LeftFoot",
            to: "Actions.LeftFoot",
            filters: [
                {
                    type: "exponentialSmoothing",
                    translation: FOOT_SMOOTHING_TRANSLATION,
                    rotation: FOOT_SMOOTHING_ROTATION
                }
            ]
        },
        {
            from: "Standard.RightFoot",
            to: "Actions.RightFoot",
            filters: [
                {
                    type: "exponentialSmoothing",
                    translation: FOOT_SMOOTHING_TRANSLATION,
                    rotation: FOOT_SMOOTHING_ROTATION
                }
            ]
        },
        {
            from: "Standard.Hips",
            to: "Actions.Hips",
            filters: [
                {
                    type: "exponentialSmoothing",
                    translation: TORSO_SMOOTHING_TRANSLATION,
                    rotation: TORSO_SMOOTHING_ROTATION
                }
            ]
        },
        {
            from: "Standard.Spine2",
            to: "Actions.Spine2",
            filters: [
                {
                    type: "exponentialSmoothing",
                    translation: TORSO_SMOOTHING_TRANSLATION,
                    rotation: TORSO_SMOOTHING_ROTATION
                }
            ]
        }
    ]
};

//
// tablet app boiler plate
//

var TABLET_BUTTON_NAME = "EXPFILT";
var HTML_URL = Script.getExternalPath(Script.ExternalPaths.HF_Public, "/tony/html/exponentialFilterApp.html?7");

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 getTranslation(i) {
    return mappingJson.channels[i].filters[0].translation;
}
function setTranslation(i, value) {
    mappingJson.channels[i].filters[0].translation = value;
    mappingChanged();
}
function getRotation(i) {
    return mappingJson.channels[i].filters[0].rotation;
}
function setRotation(i, value) {
    mappingJson.channels[i].filters[0].rotation = value; mappingChanged();
}

function onWebEventReceived(msg) {
    if (msg.name === "init-complete") {
        var values = [
            {name: "enable-filtering", val: filterEnabled ? "on" : "off", checked: false},
            {name: "left-hand-translation", val: getTranslation(LEFT_HAND_INDEX), checked: false},
            {name: "left-hand-rotation", val: getRotation(LEFT_HAND_INDEX), checked: false},
            {name: "right-hand-translation", val: getTranslation(RIGHT_HAND_INDEX), checked: false},
            {name: "right-hand-rotation", val: getRotation(RIGHT_HAND_INDEX), checked: false},
            {name: "left-foot-translation", val: getTranslation(LEFT_FOOT_INDEX), checked: false},
            {name: "left-foot-rotation", val: getRotation(LEFT_FOOT_INDEX), checked: false},
            {name: "right-foot-translation", val: getTranslation(RIGHT_FOOT_INDEX), checked: false},
            {name: "right-foot-rotation", val: getRotation(RIGHT_FOOT_INDEX), checked: false},
            {name: "hips-translation", val: getTranslation(HIPS_INDEX), checked: false},
            {name: "hips-rotation", val: getRotation(HIPS_INDEX), checked: false},
            {name: "spine2-translation", val: getTranslation(SPINE2_INDEX), checked: false},
            {name: "spine2-rotation", val: getRotation(SPINE2_INDEX), checked: false}
        ];
        tablet.emitScriptEvent(JSON.stringify(values));
    } else if (msg.name === "enable-filtering") {
        if (msg.val === "on") {
            filterEnabled = true;
        } else if (msg.val === "off") {
            filterEnabled = false;
        }
        mappingChanged();
    } else if (msg.name === "left-hand-translation") {
        setTranslation(LEFT_HAND_INDEX, Number(msg.val));
    } else if (msg.name === "left-hand-rotation") {
        setRotation(LEFT_HAND_INDEX, Number(msg.val));
    } else if (msg.name === "right-hand-translation") {
        setTranslation(RIGHT_HAND_INDEX, Number(msg.val));
    } else if (msg.name === "right-hand-rotation") {
        setRotation(RIGHT_HAND_INDEX, Number(msg.val));
    } else if (msg.name === "left-foot-translation") {
        setTranslation(LEFT_FOOT_INDEX, Number(msg.val));
    } else if (msg.name === "left-foot-rotation") {
        setRotation(LEFT_FOOT_INDEX, Number(msg.val));
    } else if (msg.name === "right-foot-translation") {
        setTranslation(RIGHT_FOOT_INDEX, Number(msg.val));
    } else if (msg.name === "right-foot-rotation") {
        setRotation(RIGHT_FOOT_INDEX, Number(msg.val));
    } else if (msg.name === "hips-translation") {
        setTranslation(HIPS_INDEX, Number(msg.val));
    } else if (msg.name === "hips-rotation") {
        setRotation(HIPS_INDEX, Number(msg.val));
    } else if (msg.name === "spine2-translation") {
        setTranslation(SPINE2_INDEX, Number(msg.val));
    } else if (msg.name === "spine2-rotation") {
        setRotation(SPINE2_INDEX, Number(msg.val));
    }
}

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 filterEnabled = true;
var mapping;
function mappingChanged() {
    if (mapping) {
        mapping.disable();
    }
    if (filterEnabled) {
        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);
});