"use strict";
/* jslint vars: true, plusplus: true, forin: true*/
/* globals Tablet, Script, AvatarList, Users, Entities, MyAvatar, Camera, Overlays, Vec3, Quat, Controller, print, getControllerWorldLocation */
/* eslint indent: ["error", 4, { "outerIIFEBody": 0 }] */
//
// floatingLanternBox.js
//
// Created by MrRoboman on 17/05/04
// Copyright 2017 High Fidelity, Inc.
//
// Spawns new floating lanterns every couple seconds if the old ones have been removed.
//
// Distributed under the Apache License, Version 2.0.
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html

(function() {

    var _this;
    var LANTERN_MODEL_URL = "http://hifi-content.s3.amazonaws.com/DomainContent/Welcome%20Area/Models/chinaLantern_capsule.fbx";
    var LANTERN_SCRIPT_URL = Script.resolvePath("floatingLantern.js?v=" + Date.now());
    var LIFETIME = 120;
    var RESPAWN_INTERVAL = 1000;
    var MAX_LANTERNS = 4;
    var SCALE_FACTOR = 1;

    var LANTERN = {
        type: "Model",
        name: "Floating Lantern",
        description: "Spawns Lanterns that float away when grabbed and released!",
        modelURL: LANTERN_MODEL_URL,
        script: LANTERN_SCRIPT_URL,
        dimensions: {
            x: 0.2049 * SCALE_FACTOR,
            y: 0.4 * SCALE_FACTOR,
            z: 0.2049 * SCALE_FACTOR
        },
        gravity: {
            x: 0,
            y: -1,
            z: 0
        },
        velocity: {
            x: 0, y: .01, z: 0
        },
        linearDampening: 0,
        shapeType: 'Box',
        lifetime: LIFETIME,
        dynamic: true
    };

    lanternBox = function() {
        _this = this;
    };

    lanternBox.prototype = {

        preload: function(entityID) {
            this.entityID = entityID;
            var props = Entities.getEntityProperties(this.entityID);

            if (props.owningAvatarID === MyAvatar.sessionUUID) {
                this.respawnTimer = Script.setInterval(this.spawnAllLanterns.bind(this), RESPAWN_INTERVAL);
            }
        },

        unload: function(entityID) {
            if (this.respawnTimer) {
                Script.clearInterval(this.respawnTimer);
            }
        },

        spawnAllLanterns: function() {
            var props = Entities.getEntityProperties(this.entityID);
            var lanternCount = 0;
            var nearbyEntities = Entities.findEntities(props.position, props.dimensions.x * 0.75);

            for (var i = 0; i < nearbyEntities.length; i++) {
                var name = Entities.getEntityProperties(nearbyEntities[i], ["name"]).name;
                if (name === "Floating Lantern") {
                    lanternCount++;
                }
            }

            while (lanternCount++ < MAX_LANTERNS) {
                this.spawnLantern();
            }
        },

        spawnLantern: function() {
            var boxProps = Entities.getEntityProperties(this.entityID);

            LANTERN.position = boxProps.position;
            LANTERN.position.x += Math.random() * .2 - .1;
            LANTERN.position.y += Math.random() * .2 + .1;
            LANTERN.position.z += Math.random() * .2 - .1;
            LANTERN.owningAvatarID = boxProps.owningAvatarID;

            return Entities.addEntity(LANTERN);
        }
    };

    return new lanternBox();
});