//
//  springHold.js
//  
//  Created by Philip Rosedale on March 18, 2017
//  Copyright 2017 High Fidelity, Inc.
//
//  Attach this entity script to a model or basic shape and grab it.  The object will 
//  follow your hand like a spring, allowing you, for example, to swordfight with others.    
//  
//  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 TIMESCALE = 0.03;
    var ACTION_TTL = 10;
    var _this;

    function SpringHold() {
        _this = this;
    }

    function updateSpringAction(timescale) {
        
        var targetProps = Entities.getEntityProperties(_this.entityID);
        var props = {
            targetPosition: targetProps.position,
            targetRotation: targetProps.rotation,
            linearTimeScale: timescale,
            angularTimeScale: timescale,
            ttl: ACTION_TTL
        };
        Entities.updateAction(_this.copy, _this.actionID, props);
    }

    function createSpringAction(timescale) {

        var targetProps = Entities.getEntityProperties(_this.entityID);
        var props = {
            targetPosition: targetProps.position,
            targetRotation: targetProps.rotation,
            linearTimeScale: timescale,
            angularTimeScale: timescale,
            ttl: ACTION_TTL
        };
        _this.actionID = Entities.addAction("spring", _this.copy, props);
    }

    function createCopy() {
        var originalProps = Entities.getEntityProperties(_this.entityID);
        var props = {
            type: originalProps.type,
            color: originalProps.color,
            modelURL: originalProps.modelURL,
            dimensions: originalProps.dimensions,
            dynamic: true,
            damping: 0.0,
            angularDamping: 0.0,
            collidesWith: 'dynamic,static,kinematic',
            rotation: originalProps.rotation,
            position: originalProps.position,
            shapeType: originalProps.shapeType,
            visible: true,
            grab: { grabbable: false }
        };
        _this.copy = Entities.addEntity(props);
    }

    function deleteCopy() {
        Entities.deleteEntity(_this.copy);
    }

    function makeOriginalInvisible() {
        Entities.editEntity(_this.entityID, {
            visible: false,
            collisionless: true
        });
    }

    function makeOriginalVisible() {
        Entities.editEntity(_this.entityID, {
            visible: true,
            collisionless: false
        });
    }

    function deleteSpringAction() {
        Entities.deleteAction(_this.copy, _this.actionID);
    }

    SpringHold.prototype = {
        preload: function(entityID) {
            _this.entityID = entityID;
        },
        startNearGrab: function(entityID, data) {
            createCopy();
            createSpringAction(TIMESCALE);
            makeOriginalInvisible();
        },
        continueNearGrab: function() {
            updateSpringAction(TIMESCALE);
        },
        releaseGrab: function() {
            deleteSpringAction();
            deleteCopy();
            makeOriginalVisible();
        }
    };

    return new SpringHold();
});