// Thsis file wouldn't have been possible without help from [@vsviridov](https://github.com/vsviridov)

'require ui';
'require rpc';
'require form';

var pkg = {
	get Name() { return 'vpnbypass'; }
};

var _getInitList = rpc.declare({
	object: 'luci.' + pkg.Name,
	method: 'getInitList',
	params: ['name']
});

var _setInitAction = rpc.declare({
	object: 'luci.' + pkg.Name,
	method: 'setInitAction',
	params: ['name', 'action'],
	expect: { result: false }
});

var _getInitStatus = rpc.declare({
	object: 'luci.' + pkg.Name,
	method: 'getInitStatus',
	params: ['name']
});

var RPC = {
	listeners: [],
	on: function on(event, callback) {
		var pair = { event: event, callback: callback }
		this.listeners.push(pair);
		return function unsubscribe() {
			this.listeners = this.listeners.filter(function (listener) {
				return listener !== pair;
			});
		}.bind(this);
	},
	emit: function emit(event, data) {
		this.listeners.forEach(function (listener) {
			if (listener.event === event) {
				listener.callback(data);
			}
		});
	},
	getInitList: function getInitList(name) {
		_getInitList(name).then(function (result) {
			this.emit('getInitList', result);
		}.bind(this));

	},
	getInitStatus: function getInitStatus(name) {
		_getInitStatus(name).then(function (result) {
			this.emit('getInitStatus', result);
		}.bind(this));
	},
	setInitAction: function setInitAction(name, action) {
		_setInitAction(name, action).then(function (result) {
			this.emit('setInitAction', result);
		}.bind(this));
	}
}

var statusCBI = form.DummyValue.extend({
	renderWidget: function (section) {
		var status = E('span', {}, _("Quering") + "...");
		RPC.on('getInitStatus', function (reply) {
			if (reply[pkg.Name].version) {
				if (reply[pkg.Name].running) {
					status.innerText = _("Running (version: %s)").format(reply[pkg.Name].version);
				}
				else {
					if (reply[pkg.Name].enabled) {
						status.innerText = _("Stopped (version: %s)").format(reply[pkg.Name].version);
					}
					else {
						status.innerText = _("Stopped (Disabled)");
					}
				}
			}
			else {
				status.innerText = _("Not installed or not found")
			}
		});
		return E('div', {}, [status]);
	}
});

var buttonsCBI = form.DummyValue.extend({
	renderWidget: function (section) {

		var btn_gap = E('span', {}, '  ');
		var btn_gap_long = E('span', {}, '        ');

		var btn_start = E('button', {
			'class': 'btn cbi-button cbi-button-apply',
			disabled: true,
			click: function (ev) {
				ui.showModal(null, [
					E('p', { 'class': 'spinning' }, _('Starting %s service').format(pkg.Name))
				]);
				return RPC.setInitAction(pkg.Name, 'start');
			}
		}, _('Start'));

		var btn_action = E('button', {
			'class': 'btn cbi-button cbi-button-apply',
			disabled: true,
			click: function (ev) {
				ui.showModal(null, [
					E('p', { 'class': 'spinning' }, _('Restarting %s service').format(pkg.Name))
				]);
				return RPC.setInitAction(pkg.Name, 'restart');
			}
		}, _('Restart'));

		var btn_stop = E('button', {
			'class': 'btn cbi-button cbi-button-reset',
			disabled: true,
			click: function (ev) {
				ui.showModal(null, [
					E('p', { 'class': 'spinning' }, _('Stopping %s service').format(pkg.Name))
				]);
				return RPC.setInitAction(pkg.Name, 'stop');
			}
		}, _('Stop'));

		var btn_enable = E('button', {
			'class': 'btn cbi-button cbi-button-apply',
			disabled: true,
			click: function (ev) {
				ui.showModal(null, [
					E('p', { 'class': 'spinning' }, _('Enabling %s service').format(pkg.Name))
				]);
				return RPC.setInitAction(pkg.Name, 'enable');
			}
		}, _('Enable'));

		var btn_disable = E('button', {
			'class': 'btn cbi-button cbi-button-reset',
			disabled: true,
			click: function (ev) {
				ui.showModal(null, [
					E('p', { 'class': 'spinning' }, _('Disabling %s service').format(pkg.Name))
				]);
				return RPC.setInitAction(pkg.Name, 'disable');
			}
		}, _('Disable'));

		RPC.on('getInitStatus', function (reply) {
			if (reply[pkg.Name].version) {
				if (reply[pkg.Name].enabled) {
					btn_enable.disabled = true;
					btn_disable.disabled = false;
					if (reply[pkg.Name].running) {
						btn_start.disabled = true;
						btn_action.disabled = false;
						btn_stop.disabled = false;
					}
					else {
						btn_start.disabled = false;
						btn_action.disabled = true;
						btn_stop.disabled = true;
					}
				}
				else {
					btn_start.disabled = true;
					btn_action.disabled = true;
					btn_stop.disabled = true;
					btn_enable.disabled = false;
					btn_disable.disabled = true;
				}
			}
		});

		RPC.getInitStatus(pkg.Name);
		
		return E('div', {}, [btn_start, btn_gap, btn_action, btn_gap, btn_stop, btn_gap_long, btn_enable, btn_gap, btn_disable]);
	}
});

RPC.on('setInitAction', function (reply) {
	ui.hideModal();
	RPC.getInitStatus(pkg.Name);
});

return L.Class.extend({
	Status: statusCBI,
	Buttons: buttonsCBI
});