import QtQuick 2.0

ListModel {
	id: listModel
	
	property var list: []
	property var sectionIcons: { return {} }

	signal refreshing()
	signal refreshed()

	onListChanged: {
		clear()
		for (var i = 0; i < list.length; i++) {
			append(list[i]);
		}
	}


	function parseAppsModelItem(model, i) {
		// https://github.com/KDE/plasma-desktop/blob/master/applets/kicker/plugin/actionlist.h#L30
		var DescriptionRole = Qt.UserRole + 1;
		var GroupRole = DescriptionRole + 1;
		var FavoriteIdRole = DescriptionRole + 2;
		var IsSeparatorRole = DescriptionRole + 3;
		var IsDropPlaceholderRole = DescriptionRole + 4;
		var IsParentRole = DescriptionRole + 5;
		var HasChildrenRole = DescriptionRole + 6;
		var HasActionListRole = DescriptionRole + 7;
		var ActionListRole = DescriptionRole + 8;
		var UrlRole = DescriptionRole + 9;

		var modelIndex = model.index(i, 0);

		var item = {
			parentModel: model,
			indexInParent: i,
			name: model.data(modelIndex, Qt.DisplayRole),
			description: model.data(modelIndex, DescriptionRole),
			favoriteId: model.data(modelIndex, FavoriteIdRole),
			largeIcon: false, // for KickerListView
		};

		if (typeof model.name === 'string') {
			item.parentName = model.name
		}

		// ListView.append() doesn't like it when we have { key: [object] }.
		var url = model.data(modelIndex, UrlRole);
		if (typeof url === 'object') {
			url = url.toString();
		}
		if (typeof url === 'string') {
			item.url = url
		}

		var icon =  model.data(modelIndex, Qt.DecorationRole);
		if (typeof icon === 'object') {
			item.icon = icon
		} else if (typeof icon === 'string') {
			item.iconName = icon
		}

		return item;
	}

	function parseModel(appList, model, path) {
		// console.log(path, model, model.description, model.count);
		for (var i = 0; i < model.count; i++) {
			var item = model.modelForRow(i);
			if (!item) {
				item = parseAppsModelItem(model, i);
			}
			var itemPath = (path || []).concat(i);
			if (item && item.hasChildren) {
				// console.log(item)
				parseModel(appList, item, itemPath);
			} else {
				// console.log(itemPath, item, item.description);
				appList.push(item);
			}
		}
	}


	function refresh() {
		refreshing()

		refreshed()
	}

	function log() {
		for (var i = 0; i < list.length; i++) {
			var item = list[i];
			console.log(JSON.stringify({
				name: item.name,
				description: item.description,
			}, null, '\t'))
		}
	}

	function triggerIndex(index) {
		var item = list[index]
		item.parentModel.trigger(item.indexInParent, "", null);
		itemTriggered()
	}

	signal itemTriggered()

	function hasActionList(index) {
		var DescriptionRole = Qt.UserRole + 1;
		var HasActionListRole = DescriptionRole + 7;

		var item = list[index]
		var modelIndex = item.parentModel.index(item.indexInParent, 0)
		return item.parentModel.data(modelIndex, HasActionListRole)
	}

	function getActionList(index) {
		var DescriptionRole = Qt.UserRole + 1;
		var ActionListRole = DescriptionRole + 8;

		var item = list[index]
		var modelIndex = item.parentModel.index(item.indexInParent, 0)
		return item.parentModel.data(modelIndex, ActionListRole)
	}

	function triggerIndexAction(index, actionId, actionArgument) {
		// kicker/code/tools.js triggerAction()

		var item = list[index]
		item.parentModel.trigger(item.indexInParent, actionId, actionArgument)
		itemTriggered()
	}

	function getByValue(key, value) {
		for (var i = 0; i < count; i++) {
			var item = get(i)
			if (item[key] == value) {
				return item
			}
		}
		return null
	}

	function hasApp(favoriteId) {
		for (var i = 0; i < count; i++) {
			var item = get(i);
			if (item.favoriteId == favoriteId) {
				return true
			}
		}
	}
}