"use strict";
/*jslint nomen: true, plusplus: true, vars: true*/
/*global Entities, Script, Quat, Vec3, Camera, MyAvatar, print, randFloat*/
//  acAudioSearchCompatibleEntitySpawner.js
//  audio/acAudioSearching
//
//  Created by Eric Levin 2/2/2016
//  Copyright 2016 High Fidelity, Inc.

//  This is a client script which spawns entities with a field in userData compatible with the AcAudioSearchAndInject script
//  These entities specify data about the sound they want to play, such as url, volume, and whether to loop or not
//  The position of the entity determines the position from which the sound plays from
//
//  Distributed under the Apache License, Version 2.0.
//  See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
//

var N_SOUNDS = 1000;
var N_SILENT_ENTITIES_PER_SOUND = 10;
var ADD_PERIOD = 50; // ms between adding 1 sound + N_SILENT_ENTITIES_PER_SOUND, to not overrun entity server.
var SPATIAL_DISTRIBUTION = 10; // meters spread over how far to randomly distribute enties.
Script.include("../../libraries/utils.js");
var orientation = Camera.getOrientation();
orientation = Quat.safeEulerAngles(orientation);
orientation.x = 0;
orientation = Quat.fromVec3Degrees(orientation);
var center = Vec3.sum(MyAvatar.position, Vec3.multiply(3, Quat.getFront(orientation)));
// http://hifi-public.s3.amazonaws.com/ryan/demo/0619_Fireplace__Tree_B.L.wav
var SOUND_DATA_KEY = "io.highfidelity.soundKey";
var userData = {
    soundKey: {
        url: "http://hifi-content.s3.amazonaws.com/DomainContent/Junkyard/Sounds/ClothSail/cloth_sail3.L.wav",
        volume: 0.3,
        loop: false,
        playbackGap: 20000, // In ms - time to wait in between clip plays
        playbackGapRange: 5000 // In ms - the range to wait in between clip plays
    }
};

var userDataString = JSON.stringify(userData);
var entityProps = {
    type: "Box",
    name: 'audioSearchEntity',
    color: {
        red: 200,
        green: 10,
        blue: 200
    },
    dimensions: {
        x: 0.1,
        y: 0.1,
        z: 0.1
    }
};

var entities = [], nSounds = 0;
Script.include("../../libraries/utils.js");
function addOneSet() {
    function randomizeDimension(coordinate) {
        return coordinate + randFloat(-SPATIAL_DISTRIBUTION / 2, SPATIAL_DISTRIBUTION / 2);
    }
    function randomize() {
        return {x: randomizeDimension(center.x), y: randomizeDimension(center.y), z: randomizeDimension(center.z)};
    }
    function addOne() {
        entityProps.position = randomize();
        entities.push(Entities.addEntity(entityProps));
    }
    var i;
    entityProps.userData = userDataString;
    entityProps.color.red = 200;
    addOne();
    delete entityProps.userData;
    entityProps.color.red = 10;
    for (i = 0; i < N_SILENT_ENTITIES_PER_SOUND; i++) {
        addOne();
    }
    if (++nSounds < N_SOUNDS) {
        Script.setTimeout(addOneSet, ADD_PERIOD);
    }
}
addOneSet();

function cleanup() {
    entities.forEach(Entities.deleteEntity);
}
// In console:
// Entities.findEntities(MyAvatar.position, 100).forEach(function (id) { if (Entities.getEntityProperties(id).name === 'audioSearchEntity') Entities.deleteEntity(id); })

Script.scriptEnding.connect(cleanup);