//
//  breakdanceEntity.js
//  examples/entityScripts
//
//  Created by Brad Hefta-Gaub on 9/3/15.
//  Copyright 2015 High Fidelity, Inc.
//
//  This is an example of an entity script which when assigned to an entity, will start the breakdance game if you grab and hold the entity
//
//  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("../toys/breakdanceCore.js");
    Script.include("../libraries/utils.js");

    var _this;

    // this is the "constructor" for the entity as a JS object we don't do much here, but we do want to remember
    // our this object, so we can access it in cases where we're called without a this (like in the case of various global signals)
    BreakdanceEntity = function() {
        _this = this;
        print("BreakdanceEntity constructor");
    };

    BreakdanceEntity.prototype = {

        // update() will be called regulary, because we've hooked the update signal in our preload() function
        // we will check out userData for the grabData. In the case of the hydraGrab script, it will tell us
        // if we're currently being grabbed and if the person grabbing us is the current interfaces avatar.
        // we will watch this for state changes and print out if we're being grabbed or released when it changes.
        update: function() {
            //print("BreakdanceEntity.update() _this.entityID:" + _this.entityID);
            var GRAB_USER_DATA_KEY = "grabKey";

            // because the update() signal doesn't have a valid this, we need to use our memorized _this to access our entityID
            var entityID = _this.entityID;

            // we want to assume that if there is no grab data, then we are not being grabbed
            var defaultGrabData = { activated: false, avatarId: null };

            // this handy function getEntityCustomData() is available in utils.js and it will return just the specific section
            // of user data we asked for. If it's not available it returns our default data.
            var grabData = getEntityCustomData(GRAB_USER_DATA_KEY, entityID, defaultGrabData);

            // if the grabData says we're being grabbed, and the owner ID is our session, then we are being grabbed by this interface
            if (grabData.activated && grabData.avatarId == MyAvatar.sessionUUID) {
                //print("BreakdanceEntity.update() [I'm being grabbed] _this.entityID:" + _this.entityID);
                if (!_this.beingGrabbed) {
                    print("I'm was grabbed... _this.entityID:" + _this.entityID);

                    // remember we're being grabbed so we can detect being released
                    _this.beingGrabbed = true;
                    var props = Entities.getEntityProperties(entityID);
                    var puppetPosition = getPuppetPosition(props);
                    breakdanceStart(props.modelURL, puppetPosition);
                } else {
                    breakdanceUpdate();
                }

            } else if (_this.beingGrabbed) {

                // if we are not being grabbed, and we previously were, then we were just released, remember that
                // and print out a message
                _this.beingGrabbed = false;
                print("I'm was released... _this.entityID:" + _this.entityID);
                breakdanceEnd();
            }
        },

        // preload() will be called when the entity has become visible (or known) to the interface
        // it gives us a chance to set our local JavaScript object up. In this case it means:
        //   * remembering our entityID, so we can access it in cases where we're called without an entityID
        //   * connecting to the update signal so we can check our grabbed state
        preload: function(entityID) {
            this.entityID = entityID;
            print("BreakdanceEntity.preload() this.entityID:" + this.entityID);
            Script.update.connect(this.update);
        },

        // unload() will be called when our entity is no longer available. It may be because we were deleted,
        // or because we've left the domain or quit the application. In all cases we want to unhook our connection
        // to the update signal
        unload: function(entityID) {
            print("BreakdanceEntity.unload() this.entityID:" + this.entityID);
            Script.update.disconnect(this.update);
        },

    };

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