/*
mouseLook.js – mouse look switching script
by rampa3 (https://github.com/rampa3) and vegaslon (https://github.com/vegaslon)
*/
(function() { // BEGIN LOCAL_SCOPE

    var away;

    var hmd = HMD.active;

    var mouseLookEnabled = Camera.getMouseLook();

    var tablet = Tablet.getTablet("com.highfidelity.interface.tablet.system");

    var tabletUp;
    
    var keysOnOverlay = Desktop.isOverlayWindowFocused();

    var tempOff = false;

    var altMode = false;

    Camera.mouseLookChanged.connect(onMouseLookChanged);

    function onMouseLookChanged(newMouseLook) {
        mouseLookEnabled = newMouseLook;
    }

    if (!hmd){
        if (mouseLookEnabled) {
            if (!keysOnOverlay) {
                if (!tablet.tabletShown){
                    Window.displayAnnouncement("Mouse look: ON");
                    mouseLookOn();
                } else {
                    Window.displayAnnouncement("Tablet is up – mouse look temporarily OFF.");
                }
            }
        }
    }

    Controller.keyPressEvent.connect(onKeyPressEvent);

    function onKeyPressEvent(event) {
        if (!hmd){
            if(event.isAlt){
                if (keysOnOverlay) return;
                if (!mouseLookEnabled) return;
                mouseLookOff();
                Window.displayAnnouncement("Mouse look: Temporarily OFF");
                tempOff = true;
                altMode = true;
            }
            if (tempOff && altMode && ['left', 'right', 'up', 'down', 'esc', 'w', 'a', 's', 'd'].includes(event.text.toLowerCase())){
                if (keysOnOverlay) return;
                if (!mouseLookEnabled) return;
                mouseLookOn();
                tempOff = false;
                altMode = false
            }
            if (event.text.toLowerCase() === 'm') {
                if (!keysOnOverlay) {
                    if (mouseLookEnabled) {
                        if (!Camera.getCaptureMouse()){
                            tempOff = false;
                            Window.displayAnnouncement("Mouse look: ON");
                            mouseLookOn();
                        } else {
                            tempOff = true;
                            Window.displayAnnouncement("Mouse look: Temporarily OFF");
                            mouseLookOff();
                        }
                    }
                }
            }
        }
    }

    tablet.tabletShownChanged.connect(onTabletShownChanged);

    function onTabletShownChanged() {
        if (!hmd) {
            if (mouseLookEnabled) {
                if (!tablet.toolbarMode) {
                    if (!keysOnOverlay) {
                        if (tablet.tabletShown) {
                            tabletUp = true;
                            if (!tempOff) {
                                if (!away) {
                                    Window.displayAnnouncement("Tablet is up – mouse look temporarily OFF.");
                                    mouseLookOff();
                                }
                            }
                        } else if (!tablet.tabletShown) {
                            tabletUp = false;
                            if (!tempOff) {
                                if (!away && !keysOnOverlay) {
                                    Window.displayAnnouncement("Tablet hidden – mouse look ON.");
                                    mouseLookOn();
                                }
                            }
                        }
                    }
                }
            }
        }
    }

    MyAvatar.wentAway.connect(onWentAway);

    function onWentAway() {
        if (!hmd) {
            if (mouseLookEnabled) {
                away = true;
                if (!keysOnOverlay) {
                    if (!tabletUp){
                        Window.displayAnnouncement("Away state ON – mouse look temporarily OFF.")
                        tempOff = false;
                        mouseLookOff()
                    }
                }
            }
        }
    }

    MyAvatar.wentActive.connect(onWentActive);

    function onWentActive() {
        if (!hmd) {
            if (mouseLookEnabled) {
                away = false;
                if (!keysOnOverlay) {
                    if (!tabletUp) {
                        Window.displayAnnouncement("Away state OFF – mouse look ON.");
                        mouseLookOn();
                    }
                }
            }
        }
    }

    HMD.displayModeChanged.connect(onDisplayModeChanged);

    function onDisplayModeChanged() {
        if (mouseLookEnabled) {
            if (HMD.active) {
                hmd = true;
                mouseLookOff();
            } else {
                hmd = false;
                if (!tempOff) {
                    if (!keysOnOverlay) {
                        if (!tabletUp) {
                            mouseLookOn();
                        }
                    }
                }
            }
        }
    }

    function mouseLookOn() {
        if (mouseLookEnabled)
            Camera.captureMouse = true;
    }

    function mouseLookOff() {
        Camera.captureMouse = false;
    }
    
    Desktop.uiFocusChanged.connect(onUiFocusChanged);
    
    function onUiFocusChanged(keyFocus) {
        if (!hmd) {
            if (mouseLookEnabled) {
                if (keyFocus) {
                    keysOnOverlay = true;
                    if (Camera.captureMouse) {
                        mouseLookOff();
                    }
                } else {
                    keysOnOverlay = false;
                    if (!tablet.tabletShown) {
                        if (!tempOff) {
                            if (!away) {
                                mouseLookOn();
                            }
                        }
                    }
                }
            }
        }
    }

    Messages.messageReceived.connect(onMessageReceived);
    function onMessageReceived(channel, message, sender, localOnly) {
        if (channel === "Hifi-Away-Enable")
            if (message === 'enable') mouseLookOn();
    }

    Script.scriptEnding.connect(onScriptEnding);

    function onScriptEnding() {
        Camera.captureMouse = false;
        Camera.mouseLookChanged.disconnect(onMouseLookChanged);
        Controller.keyPressEvent.disconnect(onKeyPressEvent);
        tablet.tabletShownChanged.disconnect(onTabletShownChanged);
        MyAvatar.wentAway.disconnect(onWentAway);
        MyAvatar.wentActive.disconnect(onWentActive);
        HMD.displayModeChanged.disconnect(onDisplayModeChanged);
        Desktop.uiFocusChanged.disconnect(onUiFocusChanged);
        Script.scriptEnding.disconnect(onScriptEnding);
    }

}()); // END LOCAL_SCOPE