/*
 * The FreeSWITCH Portal Project
 * Copyright (C) 2013-2013, Seven Du <dujinfang@gmail.com>
 *
 * Version: MPL 1.1
 *
 * The contents of this file are subject to the Mozilla Public License Version
 * 1.1 (the "License"); you may not use this file except in compliance with
 * the License. You may obtain a copy of the License at
 * http://www.mozilla.org/MPL/
 *
 * Software distributed under the License is distributed on an "AS IS" basis,
 * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
 * for the specific language governing rights and limitations under the
 * License.
 *
 * The Original Code is The FreeSWITCH Portal Project Software/Application
 *
 * The Initial Developer of the Original Code is
 * Seven Du <dujinfang@gmail.com>
 * Portions created by the Initial Developer are Copyright (C)
 * the Initial Developer. All Rights Reserved.
 *
 * Contributor(s):
 *
 * Seven Du <dujinfang@gmail.com>
 *
 *
 * fsportal.js -- The FreeSWITCH Portal Project
 *
 */

var App = Ember.Application.create({
	LOG_TRANSITIONS: true,
	rootElement: $('#container'),
	total: 0,
	ready: function(){
		$.get("/txtapi/status", function(data){
			$('#serverStatus').html("<pre>" + data + "</pre>");
		});
	}
});

App.ApplicationRoute = Ember.Route.extend({
	setupController: function(controller) {
		// alert("setupController");
	},
	actions: {
		newUser: function() {
			return Bootstrap.ModalManager.show('newUserForm');
		}
	}
});

App.CallsRoute = Ember.Route.extend({
	setupController: function(controller) {
		// Set the IndexController's `title`
		// controller.set('title', "My App");
		// alert("a")
		console.log("callsRoute");
		App.callsController.load();
  	}//,
  	// renderTemplate: function() {
	// this.render('calls');
  	// }
});

App.ChannelsRoute = Ember.Route.extend({
	setupController: function(controller) {
		// Set the IndexController's `title`
		// controller.set('title', "My App");
		// alert("a")
		console.log("callsRoute");
		App.channelsController.load();
  	}//,
  	// renderTemplate: function() {
		// this.render('calls');
  	// }
});

App.ShowRegistrationsRoute = Ember.Route.extend({
	setupController: function(controller) {
		// Set the Controller's `title`
		controller.set('title', "ShowRegistrations");
		App.registrationsController.load();
	}//,
	// renderTemplate: function() {
		// this.render('calls');
	// }
});

App.ShowModulesRoute = Ember.Route.extend({
	setupController: function(controller) {
		// Set the Controller's `title`
		App.showModulesController.load();
  	}//,
  	// renderTemplate: function() {
		// this.render('calls');
  	// }
});

App.ShowApplicationsRoute = Ember.Route.extend({
	setupController: function(controller) {
		// Set the Controller's `title`
		controller.set('title', "ShowApplications");
		console.log("showApplications");
		App.applicationsController.load();
	}//,
	// renderTemplate: function() {
		// this.render('calls');
	// }
});

App.ShowEndpointsRoute = Ember.Route.extend({
	setupController: function(controller) {
		// Set the Controller's `title`
		controller.set('title', "ShowEndpoints");
		console.log(controller);
		App.showEndpointsController.load();
  	}//,
  	// renderTemplate: function() {
		// this.render('calls');
  	// }
});

App.ShowCodecsRoute = Ember.Route.extend({
	setupController: function(controller) {
		App.showCodecsController.load();
  	}
});

App.ShowFilesRoute = Ember.Route.extend({
	setupController: function(controller) {
		App.showFilesController.load();
	}
});

App.ShowAPIsRoute = Ember.Route.extend({
	setupController: function(controller) {
		App.showAPIsController.load();
	}
});

App.ShowAliasesRoute = Ember.Route.extend({
	setupController: function(controller) {
		App.showAliasesController.load();
	}
});

App.ShowCompletesRoute = Ember.Route.extend({
	setupController: function(controller) {
		App.showCompletesController.load();
	}
});

App.ShowManagementsRoute = Ember.Route.extend({
	setupController: function(controller) {
		App.showManagementsController.load();
	}
});

App.ShowSaysRoute = Ember.Route.extend({
	setupController: function(controller) {
		App.showSaysController.load();
	}
});

App.ShowNatMapsRoute = Ember.Route.extend({
	setupController: function(controller) {
		App.showNatMapsController.load();
	}
});

App.ShowChatsRoute = Ember.Route.extend({
	setupController: function(controller) {
		App.showChatsController.load();
	}
});

App.ShowInterfacesRoute = Ember.Route.extend({
	setupController: function(controller) {
		App.showInterfacesController.load();
	}
});

App.ShowInterfaceTypesRoute = Ember.Route.extend({
	setupController: function(controller) {
		App.showInterfaceTypesController.load();
	}
});

App.ShowTasksRoute = Ember.Route.extend({
	setupController: function(controller) {
		App.showTasksController.load();
	}
});

App.ShowLimitsRoute = Ember.Route.extend({
	setupController: function(controller) {
		App.showLimitsController.load();
	}
});

App.UsersRoute = Ember.Route.extend({
	setupController: function(controller) {
		App.usersController.load();
	}
});

App.newUserRoute = Ember.Route.extend({
	setupController: function(Controller) {
		alert("auto_update_calls");
	},
	actions: {
		show: function(controller) {
			App.newUserController.show();
		}
	}
});

App.SofiaStatusRoute = Ember.Route.extend({
	setupController: function(controller) {
		App.sofiaStatusController.load();
	}
});

App.Router.map(function(){
	this.route("calls");
	this.route("channels");
	this.route("showRegistrations");
	this.route("showModules");
	this.route("showApplications");
	this.route("showEndpoints");
	this.route("showCodecs");
	this.route("showFiles");
	this.route("showAPIs");
	this.route("showAliases");
	this.route("showCompletes");
	this.route("showManagements");
	this.route("showNatMaps");
	this.route("showSays");
	this.route("showChats");
	this.route("showInterfaces");
	this.route("showInterfaceTypes");
	this.route("showTasks");
	this.route("showLimits");
	this.route("show");
	this.route("users");
	this.route("newUser");
	this.route("sofiaStatus");
	this.route("addGateway");
	this.route("about", { path: "/about" });
});

App.User = Em.Object.extend({
	id: null,
	context: null,
	domain: null,
	group: null,
	contact: null
});

App.Call = Em.Object.extend({
	uuid: null,
	cidName: null,
	cidNumber: null

});

App.Channel = Em.Object.extend({
	uuid: null,
	cidName: null,
	cidNumber: null

});

App.ApplicationController = Ember.ObjectController.extend({
	actions: {
		newUser: function() {
			alert("ApplicationController");
		}
	}
});

App.callsController = Ember.ArrayController.create({
	content: [],
	init: function(){
	},
	load: function() {
		var me = this;
		$.getJSON("/txtapi/show?calls%20as%20json", function(data){
			  // var channels = JSON.parse(data);
			console.log(data.row_count);
			me.set('total', data.row_count);
			me.content.clear();
			if (data.row_count == 0) return;

			// me.pushObjects(data.rows);
			data.rows.forEach(function(r) {
				me.pushObject(App.Call.create(r));
			});

		});
	},
	delete: function(uuid) {
		var obj = this.content.findProperty("uuid", uuid);
		if (obj) this.content.removeObject(obj);// else alert(uuid);
	},
	dump: function(uuid) {
		var obj = this.content.findProperty("uuid", uuid);
		console.log(obj.getProperties(["uuid", "cid_num"]));
	},
	raw: function() {
		$.get("/api/show?calls", function(data){
			$('#aa').html(data);
		});
	}
});

App.channelsController = Ember.ArrayController.create({
	content: [],
	listener: undefined,
	init: function(){
	},
	load: function() {
		var me = this;
		$.getJSON("/txtapi/show?channels%20as%20json", function(data){
			  // var channels = JSON.parse(data);
		 	console.log(data.row_count);
			me.set('total', data.row_count);
			me.content.clear();
			if (data.row_count == 0) return;
			data.rows.forEach(function(row) {
				me.pushObject(App.Channel.create(row));
		 	});

		});
	},
	delete: function(uuid) {
		var obj = this.content.findProperty("uuid", uuid);
		if (obj) this.content.removeObject(obj);// else alert(uuid);
	},
	dump: function(uuid) {
		var obj = this.content.findProperty("uuid", uuid);
		console.log(obj.getProperties(["uuid", "cid_num"]));
	},
	checkEvent: function () { // event_sink with json is not yet support in FS
		console.log("check");
		var me = this;
		if (!this.get("listener")) {
			$.getJSON("/api/event_sink?command=create-listener&events=ALL&format=json", function(data){
				console.log(data);
				if (data.listener) {
					me.set("listener", data.listener["listen-id"]);
				}
			});
		}
		if (!me.get("listener")) return;

		$.getJSON("/api/event_sink?command=check-listener&listen-id=" +
			me.get("listener") + "&format=json", function(data){
			console.log(data);
			if (!data.listener) {
				me.set("listener", undefined);
			} else {
				data.events.forEach(function(e) {
					eventCallback(e);
				});
			}
		});
	},
	checkXMLEvent: function() {
		console.log("check XML Event");
		var me = this;
		if (!this.get("listener")) {
			$.get("/api/event_sink?command=create-listener&events=ALL", function(data){
				// console.log(data);
				var listen_id = data.getElementsByTagName("listen-id")[0];
				if (listen_id) {
					me.set("listener", listen_id.textContent);
				}
			});
		}

		if (!me.get("listener")) return;

		$.get("/api/event_sink?command=check-listener&listen-id=" + me.get("listener"), function(data){
			// console.log(data);
			var listener = data.getElementsByTagName("listener")[0];
			if (!listener) {
				me.set("listener", undefined);
			} else {
				var events = data.getElementsByTagName("event");
				for (var i=0; i<events.length; i++) {
					var e = {};
					var headers = events[i].getElementsByTagName("headers")[0];
					for (var j=0; j<headers.childNodes.length; j++) {
						e[headers.childNodes[j].nodeName] = headers.childNodes[j].textContent;
					}
					// console.log(e);
					eventCallback(e);
				}
			}
		});
	}

});

App.registrationsController = Ember.ArrayController.create({
	content: [],
	init: function(){
	},
	load: function() {
		var me = this;
		$.getJSON("/txtapi/show?registrations%20as%20json", function(data){
			  // var channels = JSON.parse(data);
			console.log(data.row_count);
			me.set('total', data.row_count);
			me.content.clear();
			if (data.row_count == 0) return;

			me.pushObjects(data.rows);

		});
	}
});

App.applicationsController = Ember.ArrayController.create({
	content: [],
	init: function(){
	},
	load: function() {
		var me = this;
		$.getJSON("/txtapi/show?application%20as%20json", function(data){
			  // var channels = JSON.parse(data);
			console.log(data.row_count);
			me.set('total', data.row_count);
			me.content.clear();
			if (data.row_count == 0) return;

			me.pushObjects(data.rows);

		});
	}
});

App.showEndpointsController = Ember.ArrayController.create({
	content: [],
	init: function(){
	},
	load: function() {
		var me = this;
		$.getJSON("/txtapi/show?endpoints%20as%20json", function(data){
			  // var channels = JSON.parse(data);
			console.log(data.row_count);
			me.set('total', data.row_count);
			me.content.clear();
			if (data.row_count == 0) return;

			me.pushObjects(data.rows);

		});
	}
});

App.showCodecsController = Ember.ArrayController.create({
	content: [],
	init: function(){
	},
	load: function() {
		var me = this;
		$.getJSON("/txtapi/show?codec%20as%20json", function(data){
			  // var channels = JSON.parse(data);
			console.log(data.row_count);
			me.set('total', data.row_count);
			me.content.clear();
			if (data.row_count == 0) return;

			me.pushObjects(data.rows);

		});
	}
});

App.showFilesController = Ember.ArrayController.create({
	content: [],
	init: function(){
	},
	load: function() {
		var me = this;
		$.getJSON("/txtapi/show?files%20as%20json", function(data){
			  // var channels = JSON.parse(data);
			me.set('total', data.row_count);
			me.content.clear();
			if (data.row_count == 0) return;

			me.pushObjects(data.rows);

		});
	}
});

App.showAPIsController = Ember.ArrayController.create({
	content: [],
	init: function(){
	},
	load: function() {
		var me = this;
		$.getJSON("/txtapi/show?api%20as%20json", function(data){
			  // var channels = JSON.parse(data);
			me.set('total', data.row_count);
			me.content.clear();
			if (data.row_count == 0) return;

			var rows = [];
			data.rows.forEach(function(r) {
				if (r.name == "show") {
					r.syntax = r.syntax.replace(/\|/g, "\n");
				} else if (r.name == "fsctl") {
					r.syntax = r.syntax.replace(/\]\|/g, "]\n");
				} else {
					r.syntax = r.syntax.replace(/\n/g, "\n");
				}
				// console.log(r.syntax);
				rows.push(r);
			});

			me.pushObjects(rows);

		});
	}
});

App.showModulesController = Ember.ArrayController.create({
	content: [],
	init: function(){
	},
	load: function() {
		var me = this;
		$.getJSON("/txtapi/show?module%20as%20json", function(data){
			me.set('total', data.row_count);
			me.content.clear();
			console.log(data);
			if (data.row_count == 0) return;

			me.pushObjects(data.rows);

		});
	}
});

App.showAliasesController = Ember.ArrayController.create({
	content: [],
	init: function(){
	},
	load: function() {
		var me = this;
		$.getJSON("/txtapi/show?aliases%20as%20json", function(data){
			me.set('total', data.row_count);
			me.content.clear();
			if (data.row_count == 0) return;

			me.pushObjects(data.rows);

		});
	}
});

App.showCompletesController = Ember.ArrayController.create({
	content: [],
	init: function(){
	},
	load: function() {
		var me = this;
		$.getJSON("/txtapi/show?complete%20as%20json", function(data){
			me.set('total', data.row_count);
			me.content.clear();
			if (data.row_count == 0) return;

			me.pushObjects(data.rows);

		});
	}
});

App.showManagementsController = Ember.ArrayController.create({
	content: [],
	init: function(){
	},
	load: function() {
		var me = this;
		$.getJSON("/txtapi/show?management%20as%20json", function(data){
			me.set('total', data.row_count);
			me.content.clear();
			if (data.row_count == 0) return;

			me.pushObjects(data.rows);

		});
	}
});

App.showNatMapsController = Ember.ArrayController.create({
	content: [],
	init: function(){
	},
	load: function() {
		var me = this;
		$.getJSON("/txtapi/show?nat_map%20as%20json", function(data){
			me.set('total', data.row_count);
			me.content.clear();
			if (data.row_count == 0) return;

			me.pushObjects(data.rows);

		});
	}
});

App.showSaysController = Ember.ArrayController.create({
	content: [],
	init: function(){
	},
	load: function() {
		var me = this;
		$.getJSON("/txtapi/show?say%20as%20json", function(data){
			me.set('total', data.row_count);
			me.content.clear();
			if (data.row_count == 0) return;

			me.pushObjects(data.rows);

		});
	}
});

App.showChatsController = Ember.ArrayController.create({
	content: [],
	init: function(){
	},
	load: function() {
		var me = this;
		$.getJSON("/txtapi/show?chat%20as%20json", function(data){
			me.set('total', data.row_count);
			me.content.clear();
			if (data.row_count == 0) return;

			me.pushObjects(data.rows);

		});
	}
});

App.showInterfacesController = Ember.ArrayController.create({
	content: [],
	init: function(){
	},
	load: function() {
		var me = this;
		$.getJSON("/txtapi/show?interfaces%20as%20json", function(data){
			me.set('total', data.row_count);
			me.content.clear();
			if (data.row_count == 0) return;

			me.pushObjects(data.rows);

		});
	}
});

App.showInterfaceTypesController = Ember.ArrayController.create({
	content: [],
	init: function(){
	},
	load: function() {
		var me = this;
		$.getJSON("/txtapi/show?interface_types%20as%20json", function(data){
			me.set('total', data.row_count);
			me.content.clear();
			if (data.row_count == 0) return;

			me.pushObjects(data.rows);

		});
	}
});

App.showTasksController = Ember.ArrayController.create({
	content: [],
	init: function(){
	},
	load: function() {
		var me = this;
		$.getJSON("/txtapi/show?tasks%20as%20json", function(data){
			me.set('total', data.row_count);
			me.content.clear();
			if (data.row_count == 0) return;

			me.pushObjects(data.rows);

		});
	}
});

App.showLimitsController = Ember.ArrayController.create({
	content: [],
	init: function(){
	},
	load: function() {
		var me = this;
		$.getJSON("/txtapi/show?limit%20as%20json", function(data){
			me.set('total', data.row_count);
			me.content.clear();
			if (data.row_count == 0) return;

			me.pushObjects(data.rows);

		});
	}
});


App.usersController = Ember.ArrayController.create({
	content: [],
	init: function(){
	},
	load: function() {
		var me = this;
		$.get("/txtapi/list_users", function(data){
			  // var channels = JSON.parse(data);
			lines = data.split("\n");
			me.content.clear();
			var users = [];
			for (var i=1; i<lines.length; i++) {
				var line = lines[i];
				var fields = line.split("|");
				if (fields.length == 1) break;
				var user = {
					id: fields.shift(),
					context: fields.shift(),
					domain: fields.shift(),
					group: fields.shift(),
					contact: fields.shift(),
					callgroup: fields.shift(),
					cid_name: fields.shift(),
					cid_number: fields.shift()
				}
				// me.pushObject(App.User.create(user));
				users.push(App.User.create(user));
			}
				me.pushObjects(users);
		});
	}
});


App.UsersController = Ember.ObjectController.extend({
  newUserButtons: [
    Ember.Object.create({title: 'Create', clicked:"submit", type:"primary"}),
    Ember.Object.create({title: 'Cancel', clicked: "cancel", dismiss: 'modal'})
  ],

  actions: {
    //Submit the modal
    submit: function() {
	$.post("/txtapi/lua?portal/create_user.lua%20" + $("#user_id").val(), {
		data: "user_id=xxxx",
		success: function() { },
		error: function(e) { }
	});

	// Bootstrap.NM.push('Successfully submitted modal', 'success');
	return Bootstrap.ModalManager.hide('newUserForm');
    },

    //Cancel the modal, we don't need to hide the model manually because we set {..., dismiss: 'modal'} on the button meta data
    cancel: function() {
		Bootstrap.ModalManager.hide('newUserForm');
		return Bootstrap.NM.push('Modal was cancelled', 'info');
    },

    //Show the modal
    newUser: function() {
		return Bootstrap.ModalManager.show('newUserForm');
    }
  }
});

App.sofiaStatusController = Ember.ArrayController.create({
	content: [],
	init: function(){
	},
	load: function() {
		var me = this;
		$.get("/xmlapi/sofia?xmlstatus", function(data){
			console.log(data);
			var row_count = 0;
			var aliases = data.getElementsByTagName("alias");
			var profiles = data.getElementsByTagName("profile");
			var gateways = data.getElementsByTagName("gateway");

			me.content.clear();

			for (var i=0; i<aliases.length; i++) {
				var row = {};
				row.name = aliases[i].getElementsByTagName("name")[0].textContent;
				row.type = aliases[i].getElementsByTagName("type")[0].textContent;
				row.data = aliases[i].getElementsByTagName("data")[0].textContent;
				row.state = aliases[i].getElementsByTagName("state")[0].textContent;
				console.log(row)
				row_count++;
				me.pushObject(row);
			}

			for (var i=0; i<profiles.length; i++) {
				var row = {};
				row.name = profiles[i].getElementsByTagName("name")[0].textContent;
				row.type = profiles[i].getElementsByTagName("type")[0].textContent;
				row.data = profiles[i].getElementsByTagName("data")[0].textContent;
				row.state = profiles[i].getElementsByTagName("state")[0].textContent;
				row.actions = "Start | Stop | Restart | More ...";
				console.log(row)
				row_count++;
				me.pushObject(row);
			}

			for (var i=0; i<gateways.length; i++) {
				var row = {};
				row.name = gateways[i].getElementsByTagName("name")[0].textContent;
				row.type = gateways[i].getElementsByTagName("type")[0].textContent;
				row.data = gateways[i].getElementsByTagName("data")[0].textContent;
				row.state = gateways[i].getElementsByTagName("state")[0].textContent;
				row.actions = "Reg | UnReg | Delete";
				console.log(row)
				row_count++;
				me.pushObject(row);
			}

			me.set('total', row_count);
		});

	}
});

App.SofiaStatusController = Ember.ObjectController.extend({
	addGatewayButtons: [
		Ember.Object.create({title: 'Add', clicked:"submit", type:"primary"}),
		Ember.Object.create({title: 'Cancel', clicked: "cancel", dismiss: 'modal'})
	],

	actions: {
		//Submit the modal
		submit: function() {
			// alert("Not implemented");
			// return false;
			url = "/txtapi/lua?portal/create_gateway.lua%20" +
				$("#gateway_name").val() + "%20" +
				$("#gateway_realm").val() + "%20" +
				$("#gateway_username").val() + "%20" +
				$("#gateway_password").val() + "%20" +
				$("#gateway_register").is(":checked");
			$.post(url, {
				success: function() { },
				error: function(e) { }
			});

			// Bootstrap.NM.push('Successfully submitted modal', 'success');
			return Bootstrap.ModalManager.hide('newUserForm');
		},

		//Cancel the modal, we don't need to hide the model manually because we set {..., dismiss: 'modal'} on the button meta data
		cancel: function() {
			Bootstrap.ModalManager.hide('newUserForm');
			return Bootstrap.NM.push('Modal was cancelled', 'info');
		},

		//Show the modal
		addGateway: function() {
			return Bootstrap.ModalManager.show('newUserForm');
		}
	}
});

// App.initialize();
var global_debug_event = false;
var global_background_job = false;

function eventCallback(data) {
	console.log(data["Event-Name"]);

	if (global_debug_event ||
		(global_background_job && data["Event-Name"] == "BACKGROUND_JOB")) {
		console.log(data);
	}

	if (data["Event-Name"] == "CHANNEL_CREATE") {
		var channel = {
			uuid: data["Unique-ID"],
			cid_num: data["Caller-Caller-ID-Number"],
			dest: data["Caller-Destination-Number"],
			callstate: data["Channel-Call-State"],
			direction: data["Call-Direction"]
		}
		App.channelsController.pushObject(App.Channel.create(channel));

		var x = $('#auto_update_calls')[0];
		if (typeof x != "undefined" && x.checked) {
			return;
		}

		App.callsController.pushObject(App.Call.create(channel));
	} else if (data["Event-Name"] == "CHANNEL_HANGUP_COMPLETE") {
		App.channelsController.delete(data["Unique-ID"]);

		var x = $('#auto_update_calls')[0];
		if (typeof x != "undefined" && x.checked) {
			return;
		}

		App.callsController.delete(data["Unique-ID"]);
	} else if (data["Event-Name"] == "CHANNEL_BRIDGE") {
		var x = $('#auto_update_calls')[0];
		if (typeof x != "undefined" && x.checked) {
			return;
		}

		App.callsController.delete(data["Unique-ID"]);
		App.callsController.delete(data["Other-Leg-Unique-ID"]);

		var call = {
			uuid: data["Unique-ID"],
			b_uuid: data["Other-Leg-Unique-ID"],
			cid_num: data["Caller-Caller-ID-Number"],
			b_cid_num: data["Other-Leg-Caller-ID-Number"],
			dest: data["Caller-Destination-Number"],
			b_dest: data["Other-Leg-Destination-Number"],
			callstate: data["Channel-Call-State"],
			b_callstate: data["Channel-Call-State"],
			direction: data["Call-Direction"],
			b_direction: data["Other-Leg-Direction"],
			created: data["Caller-Channel-Created-Time"]
		};

		App.callsController.pushObject(App.Call.create(call));

	} else if (data["Event-Name"] == "CHANNEL_CALLSTATE") {
		var obj = App.channelsController.content.findProperty("uuid", data["Unique-ID"]);
		if (obj) {
			obj.set("callstate", data["Channel-Call-State"]);
		}

	}
}

// execute api
function api(cmdstr)
{
	cmdarr = cmdstr.split(" ");
	cmd = cmdarr.shift();
	arg = escape(cmdarr.join(" "));
	arg = arg ? "?" + arg : "";
	url = "/txtapi/" + cmd + arg;
	$.get(url, function(data){
		console.log(data);
	});
	return url;
}

//execute bgapi
function bgapi(cmd)
{
	if (!global_background_job) {
		socket.send("event json BACKGROUND_JOB");
		global_background_job = true;
	}
	api("bgapi " + cmd);
}

// subscribe event
function event(e)
{
	cmd = "event json " + e;
	socket.send(cmd);
	return cmd;
}