//  gridControls.js
//
//  Created by Ryan Huffman on 6 Nov 2014
//  Copyright 2014 High Fidelity, Inc.
//  Copyright 2022 Overte e.V.
//
//  Distributed under the Apache License, Version 2.0.
//  See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html

var createAppModeValue = "";
var voxelEditModeValue = "";

function loaded() {
    openEventBridge(function() {
        elCreateAppModeMenu = document.getElementById("create-app-mode");
        elEditModeObject = document.getElementById("edit-mode-object");
        elEditModeVoxel = document.getElementById("edit-mode-voxel");
        elVoxelEditModeMenu = document.getElementById("voxel-edit-mode");
        elVoxelEditModeSingle = document.getElementById("voxel-edit-mode-single");
        elVoxelEditModeSphere = document.getElementById("voxel-edit-mode-sphere");
        elVoxelEditModeCube = document.getElementById("voxel-edit-mode-cube");
        elMenuBackgroundOverlay = document.getElementById("menuBackgroundOverlay");
        elVoxelHelpButton = document.getElementById("voxel-help-button");
        elVoxelHelpPopup = document.getElementById("voxel-help-popup");

        elVoxelSphereSize = document.getElementById("voxel-sphere-size");
        elVoxelRemove = document.getElementById("voxel-remove");
        
        elPosY = document.getElementById("horiz-y");
        elMinorSpacing = document.getElementById("minor-spacing");
        elMajorSpacing = document.getElementById("major-spacing");
        elSnapToGrid = document.getElementById("snap-to-grid");
        elHorizontalGridVisible = document.getElementById("horiz-grid-visible");
        elMoveToSelection = document.getElementById("move-to-selection");
        elMoveToAvatar = document.getElementById("move-to-avatar");

        elCreateAppModeMenu.onclick = function() {
            document.getElementById("menuBackgroundOverlay").style.display = "block";
            document.getElementById("edit-mode-menu").style.display = "block";
        };

        elVoxelEditModeMenu.onclick = function() {
            document.getElementById("menuBackgroundOverlay").style.display = "block";
            document.getElementById("voxel-edit-mode-menu").style.display = "block";
        };

        elVoxelHelpButton.onclick = function() {
            document.getElementById("menuBackgroundOverlay").style.display = "block";
            document.getElementById("voxel-help-popup").style.display = "block";
        };

        elMenuBackgroundOverlay.onclick = function() {
            closeAllEntityListMenu();
        };

        elEditModeObject.onclick = function() {
            createAppModeValue = "object";
            elCreateAppModeMenu.value = "Object mode\u25BE";
            emitUpdateEditTools();
            closeAllEntityListMenu();
        };

        elEditModeVoxel.onclick = function() {
            createAppModeValue = "voxel";
            elCreateAppModeMenu.value = "Voxel edit mode\u25BE";
            emitUpdateEditTools();
            closeAllEntityListMenu();
        };
        
        elVoxelEditModeSingle.onclick = function() {
            voxelEditModeValue = "single";
            elVoxelEditModeMenu.value = "Single voxels\u25BE";
            emitUpdateEditTools();
            closeAllEntityListMenu();
        };

        elVoxelEditModeSphere.onclick = function() {
            voxelEditModeValue = "sphere";
            elVoxelEditModeMenu.value = "Spheres\u25BE";
            emitUpdateEditTools();
            closeAllEntityListMenu();
        };

        elVoxelEditModeCube.onclick = function() {
            voxelEditModeValue = "cube";
            elVoxelEditModeMenu.value = "Cubes\u25BE";
            emitUpdateEditTools();
            closeAllEntityListMenu();
        };

        elVoxelHelpPopup.onclick = function() {
            closeAllEntityListMenu();
        };

        if (window.EventBridge !== undefined) {
            EventBridge.scriptEventReceived.connect(function(data) {
                data = JSON.parse(data);

                if (data.createAppMode !== undefined) {
                    if (data.createAppMode === "object") {
                        createAppModeValue = data.createAppMode;
                        elCreateAppModeMenu.value = "Object mode\u25BE";
                    }
                    if (data.createAppMode === "voxel") {
                        createAppModeValue = data.createAppMode;
                        elCreateAppModeMenu.value = "Voxel edit mode\u25BE";
                    }
                }

                if (data.voxelEditMode !== undefined) {
                    if (data.voxelEditMode === "single") {
                        voxelEditModeValue = data.voxelEditMode;
                        elVoxelEditModeMenu.value = "Single voxels\u25BE";
                    }
                    if (data.voxelEditMode === "sphere") {
                        voxelEditModeValue = data.voxelEditMode;
                        elVoxelEditModeMenu.value = "Spheres\u25BE";
                    }
                    if (data.voxelEditMode === "cube") {
                        voxelEditModeValue = data.voxelEditMode;
                        elVoxelEditModeMenu.value = "Cubes\u25BE";
                    }
                }

                if (data.voxelSphereSize !== undefined) {
                    elVoxelSphereSize.value = data.voxelSphereSize;
                }

                if (data.voxelRemove !== undefined) {
                    elVoxelRemove.checked = data.voxelRemove == true;
                }

                if (data.origin) {
                    var origin = data.origin;
                    elPosY.value = origin.y;
                }

                if (data.minorGridEvery !== undefined) {
                    elMinorSpacing.value = data.minorGridEvery;
                }

                if (data.majorGridEvery !== undefined) {
                    elMajorSpacing.value = data.majorGridEvery;
                }

                if (data.gridColor) {
                    gridColor = data.gridColor;
                }

                if (data.snapToGrid !== undefined) {
                    elSnapToGrid.checked = data.snapToGrid == true;
                }

                if (data.visible !== undefined) {
                    elHorizontalGridVisible.checked = data.visible == true;
                }
            });

            function emitUpdate() {
                EventBridge.emitWebEvent(JSON.stringify({
                    type: "update",
                    origin: {
                        y: elPosY.value,
                    },
                    minorGridEvery: elMinorSpacing.value,
                    majorGridEvery: elMajorSpacing.value,
                    gridColor: gridColor,
                    snapToGrid: elSnapToGrid.checked,
                    visible: elHorizontalGridVisible.checked,
                }));
            }

            function emitUpdateEditTools() {
                EventBridge.emitWebEvent(JSON.stringify({
                    type: "update-edit-tools",
                    createAppMode: createAppModeValue,
                    voxelEditMode: voxelEditModeValue,
                    voxelSphereSize: elVoxelSphereSize.value,
                    voxelRemove: elVoxelRemove.checked,
                }));
            }
        }

        elVoxelSphereSize.addEventListener("change", emitUpdateEditTools);
        elVoxelRemove.addEventListener("change", emitUpdateEditTools);
        
        elPosY.addEventListener("change", emitUpdate);
        elMinorSpacing.addEventListener("change", emitUpdate);
        elMajorSpacing.addEventListener("change", emitUpdate);
        elSnapToGrid.addEventListener("change", emitUpdate);
        elHorizontalGridVisible.addEventListener("change", emitUpdate);

        elMoveToAvatar.addEventListener("click", function() {
            EventBridge.emitWebEvent(JSON.stringify({
                type: "action",
                action: "moveToAvatar",
            }));
        });
        elMoveToSelection.addEventListener("click", function() {
            EventBridge.emitWebEvent(JSON.stringify({
                type: "action",
                action: "moveToSelection",
            }));
        });

        var gridColor = { red: 255, green: 255, blue: 255 };
        var elColor = document.getElementById("grid-color");
        elColor.style.backgroundColor = "rgb(" + gridColor.red + "," + gridColor.green + "," + gridColor.blue + ")";

        var colorPickFunction = function (red, green, blue) {
            gridColor = { red: red, green: green, blue: blue };
            emitUpdate();
        };

        $('#grid-color').colpick({
            colorScheme: 'dark',
            layout: 'rgbhex',
            color: { r: gridColor.red, g: gridColor.green, b: gridColor.blue },
            submit: false,
            onShow: function (colpick) {
                $('#grid-color').attr('active', 'true');
            },
            onHide: function (colpick) {
                $('#grid-color').attr('active', 'false');
            },
            onChange: function (hsb, hex, rgb, el) {
                $(el).css('background-color', '#' + hex);
                colorPickFunction(rgb.r, rgb.g, rgb.b);
            }
        });

        augmentSpinButtons();
        disableDragDrop();

        EventBridge.emitWebEvent(JSON.stringify({ type: 'init' }));
    });

    const KEY_CODES = {
        BACKSPACE: 8,
        DELETE: 46
    };

    document.addEventListener("keyup", function (keyUpEvent) {
        const FILTERED_NODE_NAMES = ["INPUT", "TEXTAREA"];
        if (FILTERED_NODE_NAMES.includes(keyUpEvent.target.nodeName)) {
            return;
        }
        let {code, key, keyCode, altKey, ctrlKey, metaKey, shiftKey} = keyUpEvent;

        let controlKey = window.navigator.platform.startsWith("Mac") ? metaKey : ctrlKey;

        let keyCodeString;
        switch (keyCode) {
            case KEY_CODES.DELETE:
                keyCodeString = "Delete";
                break;
            case KEY_CODES.BACKSPACE:
                keyCodeString = "Backspace";
                break;
            default:
                keyCodeString = String.fromCharCode(keyUpEvent.keyCode);
                break;
        }

        EventBridge.emitWebEvent(JSON.stringify({
            type: 'keyUpEvent',
            keyUpEvent: {
                code,
                key,
                keyCode,
                keyCodeString,
                altKey,
                controlKey,
                shiftKey,
            }
        }));
    }, false);

    function closeAllEntityListMenu() {
        document.getElementById("menuBackgroundOverlay").style.display = "none";
        document.getElementById("edit-mode-menu").style.display = "none";
        document.getElementById("voxel-edit-mode-menu").style.display = "none";
        document.getElementById("voxel-help-popup").style.display = "none";
    }

    // Disable right-click context menu which is not visible in the HMD and makes it seem like the app has locked
    document.addEventListener("contextmenu", function (event) {
        event.preventDefault();
    }, false);

}