#!/usr/bin/env python
import sys
import re
from collections import Counter

# Il s'agit d'un parser xml, capable de travailler aussi avec XPath
from lxml import etree

#-----------------------------------------------------------
#Auteur : Santiago HY
#Usage exemple : python BaO3-dep.py fichier-udpipe.xml fichier.txt "subj"
#Le programme prend en entrée le fichier étiqueté par UDpipe dans sa forme xml, le nom du fichier de sortie et la relation de dépendance
#-----------------------------------------------------------
#argv[1] = fichier d'entrée
#argv[2] = fichier de sortie
#argv[3] = "relation syntaxique"
#-----------------------------------------------------------
output = open("test.txt", 'w', encoding='utf-8')

relation = sys.argv[3]

# Lecture d'un fichier pour stocker la totalité du fichier. 
with open(sys.argv[1], encoding="utf-8") as file:
	tree = etree.parse(file)

extractions_list = []

#Pour chaque item de chaque phrase
for phrase in tree.xpath("//p"):
	for item in phrase.xpath("item"):
		# Vérification de la relation du dépendant
		possibledep = item.xpath("a[8]/text()")
		# Si la relation contient la chaîne "subj", alors...
		if "subj" in possibledep[0]:
			# Extraction du lemme du dépendant, de sa position et de la position de sa tête
		 	lemme_dep = item.xpath("a[3]/text()")
		 	relation_dep = item.xpath("a[8]/text()")
		 	position_dep = item.xpath("a[1]/text()")
		 	position_tete = item.xpath("a[7]/text()")
		 	# Condition pour bien savoir vers où il faut parcourirs les frères de l'item
		 	if int(position_dep[0]) > int(position_tete[0]):
		 		lemme_tete = item.xpath("preceding-sibling::*[a[1]={}]/a[3]/text()".format(position_tete[0]))
		 		# On ajoute a la liste, le pair de tête et dépendant avec sa relation syntaxique
		 		extractions_list.append(lemme_tete[0]+f" -[{relation_dep[0]}]-> "+lemme_dep[0])
		 	else:
		 		lemme_tete = item.xpath("following-sibling::*[a[1]={}]/a[3]/text()".format(position_tete[0]))
		 		extractions_list.append(lemme_tete[0]+f" -[{relation_dep[0]}]-> "+lemme_dep[0])

# A partir d'un dictionnaire "Counter", on calcule le nombre d'occurrences et on trie le résultat.
extractions_count = Counter(extractions_list)
for key, value in sorted(extractions_count.items(), key=lambda x: x[1], reverse=True):
	output.write("{} {}\n".format(value,key))

output.close()