"atomic component";

var component = function(self) {

    var yaw = 0;
    var pitch = 0;
    var node = self.node;

    // Movement speed as world units per second
    var MOVE_SPEED = 20.0;
    // Mouse sensitivity as degrees per pixel
    var MOUSE_SENSITIVITY = 0.1;

    //start function called when component attached to the node, after constructor
    self.start = function() {

        Atomic.audio.listener = node.getComponent("SoundListener");

    };

    //update function called once per each frame
    self.update = function(timeStep) {

        // Use this frame's mouse motion to adjust camera node yaw and pitch. Clamp the pitch between -90 and 90 degrees
        var mouseMove = Atomic.input.mouseMove;

        // if we are on mobile
        if(Atomic.platform == "Android" || Atomic.platform == "iOS") {
        //iterate through each TouchState, if it doesn't touch any widgets, use it as a `mouse`
            for(var i = 0; i < Atomic.input.getNumTouches(); i++) {
                var touchState = Atomic.input.getTouch(i);
                if(touchState.touchedWidget == null) {
                    var delta = touchState.delta;
                    mouseMove[0] = delta[0];
                    mouseMove[1] = delta[1];
                }
            }
        }

        yaw += MOUSE_SENSITIVITY * mouseMove[0];
        pitch += MOUSE_SENSITIVITY * mouseMove[1];

        if (pitch < -90)
            pitch = 90;
        if (pitch > 90)
            pitch = 90;

        // Construct new orientation for the camera scene node from yaw and pitch. Roll is fixed to zero

        node.rotation = QuatFromEuler(pitch, yaw, 0.0);

        // Read WASD keys and move the camera scene node to the corresponding direction if they are pressed
        if (Atomic.input.getKeyDown(Atomic.KEY_W) || Atomic.input.getKeyDown(Atomic.KEY_UP))
            node.translate([0, 0, MOVE_SPEED * timeStep]);
        if (Atomic.input.getKeyDown(Atomic.KEY_S) || Atomic.input.getKeyDown(Atomic.KEY_DOWN))
            node.translate([0, 0, -MOVE_SPEED * timeStep]);
        if (Atomic.input.getKeyDown(Atomic.KEY_D) || Atomic.input.getKeyDown(Atomic.KEY_RIGHT))
            node.translate([MOVE_SPEED * timeStep, 0, 0]);
        if (Atomic.input.getKeyDown(Atomic.KEY_A) || Atomic.input.getKeyDown(Atomic.KEY_LEFT))
            node.translate([-MOVE_SPEED * timeStep, 0, 0]);

    };

};

//Math function to get Quaternion from Euler angles
function QuatFromEuler(x, y, z) {
    var M_PI = 3.14159265358979323846264338327950288;
    var q = [0, 0, 0, 0];
    x *= (M_PI / 360);
    y *= (M_PI / 360);
    z *= (M_PI / 360);
    var sinX = Math.sin(x);
    var cosX = Math.cos(x);
    var sinY = Math.sin(y);
    var cosY = Math.cos(y);
    var sinZ = Math.sin(z);
    var cosZ = Math.cos(z);
    q[0] = cosY * cosX * cosZ + sinY * sinX * sinZ;
    q[1] = cosY * sinX * cosZ + sinY * cosX * sinZ;
    q[2] = sinY * cosX * cosZ - cosY * sinX * sinZ;
    q[3] = cosY * cosX * sinZ - sinY * sinX * cosZ;
    return q;
}


exports.component = component;
