var ENTITY_LIST_HTML_URL = Script.resolvePath('../html/entityList.html');

EntityListTool = function(opts) {
    var that = {};

    var url = ENTITY_LIST_HTML_URL;
    var webView = new OverlayWebWindow({
        title: 'Entity List',  source: url,  toolWindow: true   
    });


    var filterInView = false;
    var searchRadius = 100;

    var visible = false;

    webView.setVisible(visible);

    that.webView = webView;

    that.setVisible = function(newVisible) {
        visible = newVisible;
        webView.setVisible(visible);
    };

    that.toggleVisible = function() {
        that.setVisible(!visible);
    }

    selectionManager.addEventListener(function() {
        var selectedIDs = [];

        for (var i = 0; i < selectionManager.selections.length; i++) {
            selectedIDs.push(selectionManager.selections[i]);
        }

        var data = {
            type: 'selectionUpdate',
            selectedIDs: selectedIDs,
        };
        webView.emitScriptEvent(JSON.stringify(data));
    });

    that.clearEntityList = function () {
        var data = {
            type: 'clearEntityList'
        }
        webView.emitScriptEvent(JSON.stringify(data));
    };

    function valueIfDefined(value) {
        return value !== undefined ? value : "";
    }

    that.sendUpdate = function() {
        var entities = [];

        var ids;
        if (filterInView) {
            ids = Entities.findEntitiesInFrustum(Camera.frustum);
        } else {
            ids = Entities.findEntities(MyAvatar.position, searchRadius);
        }

        var cameraPosition = Camera.position;
        for (var i = 0; i < ids.length; i++) {
            var id = ids[i];
            var properties = Entities.getEntityProperties(id);

            if (!filterInView || Vec3.distance(properties.position, cameraPosition) <= searchRadius) {
                entities.push({
                    id: id,
                    name: properties.name,
                    type: properties.type,
                    url: properties.type == "Model" ? properties.modelURL : "",
                    locked: properties.locked,
                    visible: properties.visible,
                    verticesCount: valueIfDefined(properties.renderInfo.verticesCount),
                    texturesCount: valueIfDefined(properties.renderInfo.texturesCount),
                    texturesSize: valueIfDefined(properties.renderInfo.texturesSize),
                    hasTransparent: valueIfDefined(properties.renderInfo.hasTransparent),
                    drawCalls: valueIfDefined(properties.renderInfo.drawCalls),
                    hasScript: properties.script !== ""
                });
            }
        }

        var selectedIDs = [];
        for (var i = 0; i < selectionManager.selections.length; i++) {
            selectedIDs.push(selectionManager.selections[i].id);
        }

        var data = {
            type: "update",
            entities: entities,
            selectedIDs: selectedIDs,
        };
        webView.emitScriptEvent(JSON.stringify(data));
    }


    webView.webEventReceived.connect(function(data) {
        data = JSON.parse(data);
        if (data.type == "selectionUpdate") {
            var ids = data.entityIds;
            var entityIDs = [];
            for (var i = 0; i < ids.length; i++) {
                entityIDs.push(ids[i]);
            }
            selectionManager.setSelections(entityIDs);
            if (data.focus) {
                cameraManager.enable();
                cameraManager.focus(selectionManager.worldPosition,
                                    selectionManager.worldDimensions,
                                    Menu.isOptionChecked(MENU_EASE_ON_FOCUS));
            }
        } else if (data.type == "refresh") {
            that.sendUpdate();
        } else if (data.type == "teleport") {
            if (selectionManager.hasSelection()) {
                MyAvatar.position = selectionManager.worldPosition;
            }
        } else if (data.type == "delete") {
            deleteSelectedEntities();
        } else if (data.type == "toggleLocked") {
            toggleSelectedEntitiesLocked();
        } else if (data.type == "toggleVisible") {
            toggleSelectedEntitiesVisible();
        } else if (data.type === "filterInView") {
            filterInView = data.filterInView === true;
        } else if (data.type === "radius") {
            searchRadius = data.radius;
        }
    });

    webView.visibleChanged.connect(function () {
        if (webView.visible) {
            that.sendUpdate();
        }
    });

    return that;
};