'use strict';
'require ui';
'require view';
'require poll';
'require dom';
'require modemmanager_helper as helper';

return view.extend({
	load: function() {
		return helper.getModems().then(function (modems) {
			return Promise.all(modems.filter(function (modem){
				return modem != null;
			}).map(function (modem) {
				return helper.getModemSims(modem.modem).then(function (sims) {
					modem.sims = sims.filter(function (sim) {
						return sim != null;
					});

					return helper.getModemLocation(modem.modem).then(function (location) {
						modem.location = location;
						return modem;
					});
				});
			}));
		});
	},

	pollData: function (container) {
		poll.add(L.bind(function () {
			return this.load().then(L.bind(function (modems) {
				dom.content(container, this.renderContent(modems));
			}, this));
		}, this));
	},

	renderSections: function (name, sections) {
		if (sections.length == 0) {
			sections.push(E('div', { 'class': 'cbi-section' }, [
				E('span', {}, _('Section %s is empty.').format(name))
			]));
		}

		return E('div', { 'class': 'cbi-section' }, [
			E('h1', {}, name),
			...sections
		]);
	},

	renderSection: function (name, table) {
		var rowNodes = table.filter(function (row) {
			return row[1] != null;
		}).map(function (row) {
			return E('tr', { 'class': 'tr' }, [
				E('td', { 'class': 'td', 'width': '33%' }, E('strong', {}, [row[0]])),
				E('td', { 'class': 'td' }, [row[1]])
			]);
		});

		var tableNode;
		if (rowNodes.length == 0) {
			tableNode = E('div', { 'class': 'cbi-section' }, [
				E('span', {}, _('Section %s is empty.').format(name))
			])
		} else {
			tableNode = E('table', { 'class': 'table', }, rowNodes);
		}

		return E('div', { 'class': 'cbi-section' }, [
			E('h2', {}, [name]),
			tableNode
		]);
	},

	renderContent: function (modems) {
		var node = E('div', {}, E('div'));

		modems.forEach(L.bind(function (modem) {
			var generic = modem.modem.generic;
			var modem3gpp = modem.modem['3gpp'];

			var modemSection = this.renderSection(_('Modem Info'), [
				[_('Manufacturer'), generic.manufacturer],
				[_('Model'), generic.model],
				[_('Revision'), generic.revision],
				[E('abbr', { 'title': _('International Mobile Station Equipment Identity') }, [
					_('IMEI')
				]), modem3gpp.imei],
				[_('Device Identifier'), generic['device-identifier']],
				[_('Power State'), generic['power-state']],
				[_('State'), generic.state],
				[_('Failed Reason'), generic['state-failed-reason']]
			]);

			var ownNumbersStr = generic['own-numbers'].join(', ');
			var accessTechnologiesStr = generic['access-technologies'].join(', ');
			var signalQualityValue = parseInt(generic['signal-quality'].value);
			var networkSection = this.renderSection(_('Network Registration'), [
				[_('Own Numbers'), ownNumbersStr],
				[_('Access Technologies'), accessTechnologiesStr],
				[_('Operator') , modem3gpp['operator-name']],
				[_('Operator Code'), modem3gpp['operator-code']],
				[_('Registration State'), modem3gpp['registration-state']],
				[_('Packet Service State'), modem3gpp['packet-service-state']],
				[_('Signal Quality'), E('div', { 'class': 'cbi-progressbar', 'title': '%d %'.format(signalQualityValue) }, [
					E('div', { 'style': 'width: %d%%'.format(signalQualityValue) })
				])]
			]);

			var location3gpp = {};
			if (modem.location != null) {
				location3gpp = modem.location.modem.location['3gpp'];
			}
			var locationSection = this.renderSection(_('Cell Location'), [
				[E('abbr', { 'title': _('Cell ID') }, [
					'CID'
				]), location3gpp.cid],
				[E('abbr', { 'title': _('Location Area Code') }, [
					'LAC'
				]), location3gpp.lac],
				[E('abbr', { 'title': _('Mobile Country Code') }, [
					'MCC'
				]), location3gpp.mcc],
				[E('abbr', { 'title': _('Mobile Network Code') }, [
					'MNC'
				]), location3gpp.mnc],
				[E('abbr', { 'title': _('Tracking Area Code') }, [
					'TAC'
				]), location3gpp.tac]
			]);

			var simTables = modem.sims.map(function (sim) {
				var properties = sim.sim.properties;
				return [
					[_('Active'), properties.active],
					[_('Operator Name'), properties['operator-name']],
					[E('abbr', { 'title': _('Integrated Circuit Card Identifier') }, [
						'ICCID'
					]), properties.iccid],
					[E('abbr', { 'title': _('International Mobile Subscriber Identity') }, [
							'IMSI'
					]), properties.imsi]
				];
			});
			var simSubSections = simTables.map(L.bind(function (table, index) {
				return this.renderSection(_('SIM %d').format(index + 1), table)
			}, this));
			var simSection = this.renderSections(_('SIMs'), simSubSections);

			var sections = [
				E('div', { 'class': 'cbi-map-descr'}, []),
				modemSection,
				networkSection,
				locationSection,
				simSection
			].filter(function (section) {
				return section != null;
			});
			node.firstElementChild.appendChild(E('div', { 'data-tab': generic.device, 'data-tab-title': generic.device }, sections));
		}, this));
		ui.tabs.initTabGroup(node.firstElementChild.childNodes);

		return node;
	},

	render: function (modems) {
		var content = E([], [
			E('h2', {}, [_('Mobile Service')]),
			E('div')
		]);
		var container = content.lastElementChild;

		dom.content(container, this.renderContent(modems));
		this.pollData(container);

		return content;
	},

	handleSaveApply: null,
	handleSave: null,
	handleReset: null
});
