//
  //  fireworksLaunchEntityScript.js
  //  examples/playa/fireworks
  //
  //  Created by Eric Levin on 2/24/16.
  //  Copyright 2016 High Fidelity, Inc.
  //
  //  Run this script to spawn a big fireworks launch button that a user can press
  //
  //  Distributed under the Apache License, Version 2.0.
  //  See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html

  (function() {
    Script.include("../../libraries/utils.js");
    var _this;
    Fireworks = function() {
      _this = this;
      _this.launchSound = SoundCache.getSound("https://s3-us-west-1.amazonaws.com/hifi-content/eric/Sounds/missle+launch.wav");
      _this.explosionSound = SoundCache.getSound("https://s3-us-west-1.amazonaws.com/hifi-content/eric/Sounds/fireworksExplosion.wav");
      _this.timeToExplosionRange = {
        min: 2500,
        max: 4500
      };
    };

    Fireworks.prototype = {

      startNearTrigger: function() {
        _this.shootFireworks();
      },

      startFarTrigger: function() {
        _this.shootFireworks();
      },

      clickReleaseOnEntity: function() {
        _this.shootFireworks();
      },

      shootFireworks: function() {
        // Get launch position
        var launchPosition = getEntityUserData(_this.entityID).launchPosition || _this.position;

        var numMissles = randInt(1, 3);
        for(var i = 0; i < numMissles; i++) {
        _this.shootMissle(launchPosition);
        }
      },

      shootMissle: function(launchPosition) {
        Audio.playSound(_this.launchSound, {
          position: launchPosition,
          volume: 0.5
        });

        var MODEL_URL = "https://s3-us-west-1.amazonaws.com/hifi-content/eric/models/Rocket-2.fbx";
        var missleDimensions = Vec3.multiply({
          x: 0.24,
          y: 0.7,
          z: 0.24
        }, randFloat(0.2, 1.5));
        var missleRotation = Quat.fromPitchYawRollDegrees(randInt(-60, 60), 0, randInt(-60, 60));
        var missleVelocity = Vec3.multiply(Quat.getUp(missleRotation), randFloat(2, 4));
        var missleAcceleration = Vec3.multiply(Quat.getUp(missleRotation), randFloat(1, 3));
        var missle = Entities.addEntity({
          type: "Model",
          modelURL: MODEL_URL,
          position: launchPosition,
          rotation: missleRotation,
          dimensions: missleDimensions,
          damping: 0,
          dynamic: true,
          lifetime: 20, // Just in case
          velocity: missleVelocity,
          acceleration: missleAcceleration,
          angularVelocity: {
            x: 0,
            y: randInt(-1, 1),
            z: 0
          },
          angularDamping: 0,
          visible: false
        });

        var smokeTrailPosition = Vec3.sum(launchPosition, Vec3.multiply(-missleDimensions.y / 2 + 0.1, Quat.getUp(missleRotation)));
        var smoke = Entities.addEntity({
          type: "ParticleEffect",
          position: smokeTrailPosition,
          lifespan: 10,
          lifetime: 20,
          name: "Smoke Trail",
          maxParticles: 3000,
          emitRate: 80,
          emitSpeed: 0,
          speedSpread: 0,
          dimensions: {
            x: 1000,
            y: 1000,
            z: 1000
          },
          polarStart: 0,
          polarFinish: 0,
          azimuthStart: -3.14,
          azimuthFinish: 3.14,
          emitAcceleration: {
            x: 0,
            y: 0.01,
            z: 0
          },
          accelerationSpread: {
            x: 0.01,
            y: 0,
            z: 0.01
          },
          radiusSpread: 0.03,
          particleRadius: 0.3,
          radiusStart: 0.06,
          radiusFinish: 0.9,
          alpha: 0.1,
          alphaSpread: 0,
          alphaStart: 0.7,
          alphaFinish: 0,
          textures: "https://hifi-public.s3.amazonaws.com/alan/Particles/Particle-Sprite-Smoke-1.png",
          emitterShouldTrail: true,
          parentID: missle,
        });


        Script.setTimeout(function() {
          Entities.editEntity(smoke, {
            parentID: null,
            isEmitting: false
          });

          var explodeBasePosition = Entities.getEntityProperties(missle, "position").position;
          
          Entities.deleteEntity(missle);
          // Explode 1 firework immediately
            _this.explodeFirework(explodeBasePosition);
          var numAdditionalFireworks = randInt(1, 5);
          for (var i = 0; i < numAdditionalFireworks; i++) {
            Script.setTimeout(function() {
              var explodePosition = Vec3.sum(explodeBasePosition, {x: randFloat(-3, 3), y: randFloat(-3, 3), z: randFloat(-3, 3)});
              _this.explodeFirework(explodePosition);
            }, randInt(0, 1000))
          }
        }, randFloat(_this.timeToExplosionRange.min, _this.timeToExplosionRange.max));


      },

      explodeFirework: function(explodePosition) {
        // We just exploded firework, so stop emitting its fire and smoke

        Audio.playSound(_this.explosionSound, {
          position: explodePosition
        });
        var firework = Entities.addEntity({
          name: "fireworks emitter",
          position: explodePosition,
          type: "ParticleEffect",
          colorStart: hslToRgb({
            h: Math.random(),
            s: 0.5,
            l: 0.7
          }),
          color: hslToRgb({
            h: Math.random(),
            s: 0.5,
            l: 0.5
          }),
          colorFinish: hslToRgb({
            h: Math.random(),
            s: 0.5,
            l: 0.7
          }),
          maxParticles: 10000,
          lifetime: 20,
          lifespan: randFloat(1.5, 3),
          emitRate: randInt(500, 5000),
          emitSpeed: randFloat(0.5, 2),
          speedSpread: 0.2,
          emitOrientation: Quat.fromPitchYawRollDegrees(randInt(0, 360), randInt(0, 360), randInt(0, 360)),
          polarStart: 1,
          polarFinish: randFloat(1.2, 3),
          azimuthStart: -Math.PI,
          azimuthFinish: Math.PI,
          emitAcceleration: {
            x: 0,
            y: randFloat(-1, -0.2),
            z: 0
          },
          accelerationSpread: {
            x: Math.random(),
            y: 0,
            z: Math.random()
          },
          particleRadius: randFloat(0.001, 0.1),
          radiusSpread: Math.random() * 0.1,
          radiusStart: randFloat(0.001, 0.1),
          radiusFinish: randFloat(0.001, 0.1),
          alpha: randFloat(0.8, 1.0),
          alphaSpread: randFloat(0.1, 0.2),
          alphaStart: randFloat(0.7, 1.0),
          alphaFinish: randFloat(0.7, 1.0),
          textures: "http://ericrius1.github.io/PlatosCave/assets/star.png",
        });


        Script.setTimeout(function() {
          Entities.editEntity(firework, {
            isEmitting: false
          });
        }, randInt(500, 1000));

      },

      preload: function(entityID) {
        _this.entityID = entityID;
        _this.position = Entities.getEntityProperties(_this.entityID, "position").position;
        print("EBL RELOAD ENTITY SCRIPT!!!");

      }

    };

    // entity scripts always need to return a newly constructed object of our type
    return new Fireworks();
  });