"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 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,
          y: 0.4,
          z: 0.2049
      },
      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();
});