//
//  debugHighlight.js
//  developer/utilities/render
//
//  Olivier Prat, created on 08/08/2017.
//  Copyright 2017 High Fidelity, Inc.
//
//  Distributed under the Apache License, Version 2.0.
//  See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
//

"use strict";

(function() {
    var TABLET_BUTTON_NAME = "Highlight";
    var QMLAPP_URL = Script.resolvePath("./highlight.qml");
    var ICON_URL = Script.resolvePath("../../../system/assets/images/luci-i.svg");
    var ACTIVE_ICON_URL = Script.resolvePath("../../../system/assets/images/luci-a.svg");

   
    var onLuciScreen = false;

    function onClicked() {
        if (onLuciScreen) {
            tablet.gotoHomeScreen();
        } else {
            tablet.loadQMLSource(QMLAPP_URL);
        }
    }

    var tablet = Tablet.getTablet("com.highfidelity.interface.tablet.system");
    var button = tablet.addButton({
        text: TABLET_BUTTON_NAME,
        icon: ICON_URL,
        activeIcon: ACTIVE_ICON_URL
    });

    var hasEventBridge = false;

    function wireEventBridge(on) {
        if (!tablet) {
            print("Warning in wireEventBridge(): 'tablet' undefined!");
            return;
        }
        if (on) {
            if (!hasEventBridge) {
                tablet.fromQml.connect(fromQml);
                hasEventBridge = true;
            }
        } else {
            if (hasEventBridge) {
                tablet.fromQml.disconnect(fromQml);
                hasEventBridge = false;
            }
        }
    }

    function onScreenChanged(type, url) {
        if (url === QMLAPP_URL) {
            onLuciScreen = true;
        } else { 
            onLuciScreen = false;
        }
        
        button.editProperties({isActive: onLuciScreen});
        wireEventBridge(onLuciScreen);
    }
     
    button.clicked.connect(onClicked);
    tablet.screenChanged.connect(onScreenChanged);

    Script.scriptEnding.connect(function () {
        if (onLuciScreen) {
            tablet.gotoHomeScreen();
        }
        button.clicked.disconnect(onClicked);
        tablet.screenChanged.disconnect(onScreenChanged);
        tablet.removeButton(button);
    });
   
    // Create a Laser pointer used to pick and add objects to selections
    var END_DIMENSIONS = { x: 0.05, y: 0.05, z: 0.05 };
    var COLOR1 = {red: 255, green: 0, blue: 0}; 
    var COLOR2 = {red: 0, green: 255, blue: 0};
    var end1 = {
        type: "sphere",
        dimensions: END_DIMENSIONS,
        color: COLOR1,
        ignoreRayIntersection: true
    }
    var end2 = {
        type: "sphere",
        dimensions: END_DIMENSIONS,
        color: COLOR2,
        ignoreRayIntersection: true
    }
    var laser = Pointers.createPointer(PickType.Ray, {
        joint: "Mouse",
        filter: Picks.PICK_ENTITIES,
        renderStates: [{name: "one", end: end1}],
        defaultRenderStates: [{name: "one", end: end2, distance: 2.0}],
        enabled: true
    });
    Pointers.setRenderState(laser, "one");

    var HoveringList = "Hovering"
    var hoveringStyle = {
        isOutlineSmooth: true,
        outlineWidth: 5,
        outlineUnoccludedColor: {red: 255, green: 128, blue: 128}, 
        outlineUnoccludedAlpha: 0.88,
        outlineOccludedColor: {red: 255, green: 128, blue: 128},
        outlineOccludedAlpha:0.5,
        fillUnoccludedColor: {red: 26, green: 0, blue: 0},
        fillUnoccludedAlpha: 0.0,
        fillOccludedColor: {red: 26, green: 0, blue: 0},
        fillOccludedAlpha: 0.0
    }
    Selection.enableListHighlight(HoveringList, hoveringStyle)
    
    var currentSelectionName = ""
    var isSelectionEnabled = false
    Pointers.disablePointer(laser)
     
    function fromQml(message) {
        tokens = message.split(' ')
        print("Received '"+message+"' from hightlight.qml")
        if (tokens[0]=="highlight") {
            currentSelectionName = tokens[1];
            print("Switching to highlight name "+currentSelectionName)
        } else if (tokens[0]=="pick") {
            isSelectionEnabled = tokens[1]=='true'
            print("Ray picking set to "+isSelectionEnabled.toString())
            if (isSelectionEnabled) {
                Pointers.enablePointer(laser)
            } else {
                Pointers.disablePointer(laser)
                Selection.clearSelectedItemsList(HoveringList)        
            }
            time = 0
        }
    }
    
    Entities.hoverEnterEntity.connect(function (id, event) {
      //  print("hoverEnterEntity");
        if (isSelectionEnabled) Selection.addToSelectedItemsList(HoveringList, "entity", id)
    })
    
    Entities.hoverOverEntity.connect(function (id, event) {
       // print("hoverOverEntity");
    })

    
    Entities.hoverLeaveEntity.connect(function (id, event) {
        if (isSelectionEnabled)  Selection.removeFromSelectedItemsList(HoveringList, "entity", id)        
       // print("hoverLeaveEntity");   
    })
    
    function cleanup() {
        Pointers.removePointer(laser);
        Selection.disableListHighlight(HoveringList)
        Selection.removeListFromMap(HoveringList)
    
    }
    Script.scriptEnding.connect(cleanup);
         
}());