/*
	Serialize a topic's occurrences and associations as an indented list,
	suitable for import into a topic map.  The list is multi-rooted.

	The topic type is listed (but only for the focal topic, not recursively)
	Associations are handled by giving the role name and then the player topics:

	type
		<topic type lable>
	role
		player
		player
	role
		player
	data
		occurrence type
			data
			resource
			data
		occurrence type
			data
			data
*/
function serialize2Mindmap(map,topicid, result_list, depth, INDENT){
	var depth = depth || 1
	var MAXDEPTH = 1
	var INDENT_BASE = '\t'
	var INDENT = INDENT || ''
	var label
	var theTopic
	var topic
	var type_type_label
	var role_spec
	var role_label
	var members, member
	var players, player
	var player_label
	var binaries = []
	var naries = []


	theTopic = map.getTopicById(topicid)
	var topic_type_label = getTopicLabelById(map, theTopic.instanceOf) || ''

	// Create output list of string fragments
	// Topic type
	if (topic_type_label && depth == 1) {
		result_list.push(INDENT + 'type')
		result_list.push(INDENT + INDENT_BASE + topic_type_label)
	}

	// Topic occurrences
	var occur
	var occur_label
	var data
	var occurs = theTopic.getOccursFiltered()
	if ( occurs.length && (depth == 1) ){ 
		result_list.push(INDENT + 'Data')
		for (var o in occurs) {
			occur = occurs[o]
//			occur_label = Home.getTopicLabelById(Home.tm1, occur.instanceOf) || '[unlabeled data type]'
			occur_label = getTopicLabelById(map, occur.instanceOf) || '[unlabeled data type]'
			data = occur.getResourceOrData()
			if (data) {
				result_list.push(INDENT + INDENT_BASE + occur_label)
				result_list.push(INDENT + INDENT_BASE + INDENT_BASE + data)
			}
		}
	}

	// Get all associations where our topic plays some role
	var assoc_index = map.getAssocIndex()	
	var assocs =  assoc_index[topicid]

	var assoc, assoc_id
	var player_index_by_rolespec = {}
	var templist

	for (var a in assocs) {
		assoc_id = assocs[a]
		assoc = map.getAssocByID(assoc_id)
		members = assoc.getMembers()
		if (members.length > 2) {
			naries.push(assoc)
		}
		else {
			binaries.push(assoc)
		}
	}
	
	for (var a in binaries) {
		assoc = binaries[a]
		assoc_id = assoc.id
		members = assoc.getMembers()
		for (var m in members) {
			member = members[m]
			role_spec = member.roleSpec || '[unlabeled role]'
			players = member.getPlayers()
			for (p in players) {
				player = players[p]
				// Skip our topic
				if (player.id == topicid) { continue }

				if ( !player_index_by_rolespec[role_spec] ) {
					player_index_by_rolespec[role_spec] = []
				}
				player_index_by_rolespec[role_spec].push(player)
			}
		}
	}

	
	// Topic associations (recursively to MAXDEPTH)
	for (var r in player_index_by_rolespec) {
		role_label = getTopicLabelById(map,r) || '[unlabeled role]'
		result_list.push(INDENT + role_label)

		players = player_index_by_rolespec[r]
		for (var p in players) {
			player = players[p]
			if (player.id == topicid) { continue }
			player_label = getTopicLabelById(map,player.id) || '[unlabeled role player]'
			result_list.push(INDENT + INDENT_BASE + player_label)
			if (depth < MAXDEPTH) {
				templist = []
				serialize2Mindmap(map,player.id, result_list, depth + 1, INDENT + INDENT_BASE + INDENT_BASE)
			}
		}		
	}

	var assoc_name
	var player_list
	var member_list, member_dict
	var label
	for (var a in naries) {
		assoc = naries[a]
		assoc_id = assoc.id
		assoc_name = getTopicLabelById(map, assoc.instanceOf) || 'unlabeled association'
		members = assoc.getMembers()
		member_list = []
		member_dict = {}
		for (var m in members) {
			player_list = []
			member = members[m]
			role_spec = member.roleSpec || '[unlabeled role]'
			players = member.getPlayers()
			for (p in players) {
				player = players[p]
				// Skip our topic
				if (player.id == topicid) {continue }
				player_list.push(player.id)
			}
			if (!player_list.length) {continue}
			member_list.push(role_spec)
			member_dict[role_spec] = player_list
		}

		if (!member_list.length) {continue}
		result_list.push(assoc_name)
		for (var m in member_list) {
			label = getTopicLabelById(map,member_list[m])
			result_list.push(INDENT_BASE + label)
			player_list = member_dict[member_list[m]]
			for (var r in player_list) {
				label = getTopicLabelById(map,player_list[r])
				result_list.push(INDENT_BASE + INDENT_BASE + label)
			}
		}
	}

}


/*
	Serialize a topic's occurrences and associations as an indented list,
	suitable for import into a topic map.  The list is multi-rooted.

	The topic type is listed (but only for the focal topic, not recursively)
	Associations are handled by giving the role name and then the player topics:

	type
		<topic type lable>
	role
		player
		player
	role
		player
	data
		occurrence type
			data
			resource
			data
		occurrence type
			data
			data
*/

function xserialize2Mindmap(map,topicid, result_list, depth, INDENT){
	var depth = depth || 1
	var MAXDEPTH = 2
	var INDENT_BASE = '\t'
	var INDENT = INDENT || ''
	var label
	var theTopic
	var topic
	var type_type_label
	var role_spec
	var role_label
	var members, member
	var players, player
	var player_label


	theTopic = map.getTopicById(topicid)
	var topic_type_label = getTopicLabelById(map, theTopic.instanceOf) || ''

	var assoc_index = map.getAssocIndex()
	
	// Get all associations where our topic plays some role
	var assocs =  assoc_index[topicid]

	var assoc, assoc_id
	var player_index_by_rolespec
	var templist

	for (var a in assocs) {
		assoc_id = assocs[a]
		assoc = map.getAssocByID(assoc_id)
		members = assoc.getMembers()
		for (var m in members) {
			member = members[m]
			role_spec = member.roleSpec || '[unlabeled role]'
			players = member.getPlayers()
			for (p in players) {
				player = players[p]
				// Skip our topic
				if (player.id == topicid) { continue }

				if ( !player_index_by_rolespec[role_spec] ) {
					player_index_by_rolespec[role_spec] = []
				}
				player_index_by_rolespec[role_spec].push(player)
			}
		}
	}

	// Create output list of string fragments
	// Topic type
	if (topic_type_label && depth == 1) {
		result_list.push(INDENT + 'type')
		result_list.push(INDENT + INDENT_BASE + topic_type_label)
	}

	// Topic occurrences
	var occur
	var occur_label
	var data
	var occurs = theTopic.getOccursFiltered()
	if ( occurs.length && (depth == 1) ){ 
		result_list.push(INDENT + 'Data')
		for (var o in occurs) {
			occur = occurs[o]
//			occur_label = Home.getTopicLabelById(Home.tm1, occur.instanceOf) || '[unlabeled data type]'
			occur_label = getTopicLabelById(map, occur.instanceOf) || '[unlabeled data type]'
			data = occur.getResourceOrData()
			if (data) {
				result_list.push(INDENT + INDENT_BASE + occur_label)
				result_list.push(INDENT + INDENT_BASE + INDENT_BASE + data)
			}
		}
	}
	
	// Topic associations (recursively to MAXDEPTH)
	for (var r in player_index_by_rolespec) {
		role_label = getTopicLabelById(map,r) || '[unlabeled role]'
		result_list.push(INDENT + role_label)

		players = player_index_by_rolespec[r]
		for (var p in players) {
			player = players[p]
			if (player.id == topicid) { continue }
			player_label = getTopicLabelById(map,player.id) || '[unlabeled role player]'
			result_list.push(INDENT + INDENT_BASE + player_label)
			if (depth < MAXDEPTH) {
				templist = []
				serialize2Mindmap(map,player.id, result_list, depth + 1, INDENT + INDENT_BASE + INDENT_BASE)
			}
		}		
	}
}
