/*
The MIT License (MIT)
Copyright (c) 2014-2018 Nikolai Suslov and the Krestianstvo.org project contributors. (https://github.com/NikolaySuslov/livecodingspace/blob/master/LICENSE.md)

Virtual World Framework Apache 2.0 license  (https://github.com/NikolaySuslov/livecodingspace/blob/master/licenses/LICENSE_VWF.md)
*/
// VWF & OSC driver

define(["module", "vwf/view", "vwf/view/oscjs/dist/osc-module"], function(module, view, osc) {

	return view.load(module, {

		initialize: function() {
			
			self = this;
            this.osc = osc;
            this.portValue = '8081';
            this.hostValue = 'localhost';
            this.port = null;

            //window._osc = this.osc;
            window._OSCManager = this;

		},

		firedEvent: function (nodeID, eventName, eventParameters) {
         
              
                if (eventName == 'sendOSC'){

				var clientThatSatProperty = self.kernel.client();
				var me = self.kernel.moniker();


				// If the transform property was initially updated by this view....
				if (clientThatSatProperty == me) {


					if (self.osc !== null) {
						if (this.getStatus() == 1) {
							self.port.send(eventParameters[0]);
							console.log('send: ' + eventParameters[0]);
						}
					}
				}



				}
			
		},


		/*
		 * Receives incoming messages
		 */
		calledMethod: function( nodeID, methodName, methodParameters, methodValue ) {
	


			// if (methodName == "sendOSC") {
			// 	if (self.osc !== null) {
			// 		if (this.getStatus() == 1) {
			// 			self.port.send(methodParameters[0]);
			// 			console.log('send: ' + methodParameters);
			// 		}
			// 	}
				
			// }


			if (methodName == "sendOSCBundle") {

				if (self.osc !== null) {
					if (this.getStatus() == 1) {
						self.port.send({
							timeTag: self.osc.timeTag(1), // Schedules this bundle 60 seconds from now.
							packets: [methodParameters[0]]
						}
						);
						console.log('send: ' + methodParameters[0]);
					}
				}
				//console.log("send OSC!!!");

			}

            
        },

		
		setOSCHostAndPort: function(h,p) {

			this.hostValue = h;
			this.portValue = p;
            
		},

		connect: function() {
	
			this.disconnect();

			this.port = new osc.WebSocketPort({
                url: 'ws://' + this.hostValue + ':' + this.portValue
                //url: "ws://localhost:8081"
            	});
			
           	 	this.port.on("message", function (oscMessage) {
                	console.log("message", oscMessage);
                	findAllNodesWithOSC(oscMessage);
            	});

				this.port.open();


		},

		disconnect: function() {
			console.log('disconnect');
			if (this.port !== null)
				this.port.close(1000, 'manual close');

		},

		getStatus: function() {
			if (self.port){
			return self.port.socket.readyState
			} 
			return 3
		}

		
	})

	function findAllNodesWithOSC(oscMessage){

		let appID = vwf.application();
		var oscSceneProp = vwf.getProperty(appID, 'osc');
		if (oscSceneProp !== undefined){
			if (oscSceneProp){
				//console.log('now callMethod');
				vwf_view.kernel.callMethod(appID, 'getOSC', [oscMessage]);
			}
		}

		var children = vwf.children(appID);
			children.forEach(function(child){
				var oscprop = vwf.getProperty(child, 'osc');
				if (oscprop !== undefined){
					if (oscprop){
						//console.log('now callMethod');
						vwf_view.kernel.callMethod(child, 'getOSC', [oscMessage]);
					}
				}

			})
		 // var scene = _Editor.getNode(Engine.application());
   //  	 for (var i in scene.children) {
                    
   //                  if (scene.children[i].properties.DisplayName.indexOf("leapmotion") > -1) {
   //                  this.leapHandsID = (scene.children[i].id);
   //              }
   //          }


	}

});