import re
from pathlib import Path
import sys

# Utilisation du programme :
# output sur le terminal : # python3 bao4.py fichier_annoté_udpipe relation
# output sur padagraph : python3 bao4.py fichier_annoté_udpipe relation | curl -X POST -H 'Content-Type: text/csv' --data-binary @- https://padagraph.magistry.fr/post_csv/nom_de_la_page
# exemple : python3 bao4.py bao2_UD_pl_3246.udpipe.xml obj | curl -X POST -H 'Content-Type: text/csv' --data-binary @- https://padagraph.magistry.fr/post_csv/laurine_charbonnier

# -------------------------------------------------------------------------------

# RECUPERATION DES ARGUMENTS DONNES AU PROGRAMME
fic = sys.argv[1] # fichier à exploiter
relation = sys.argv[2] # relation à extraire

def clean(s: str): # nettoyage des mots
    return re.sub(r"[^\w]", "", s) # on supprime tout ce qui n'est pas un caractère latin

# EXTRACTION DE LA RELATION
sent_buf = {} # création des buffers
rel_buf = []
couples = set()
for line in Path(fic).read_text().split("\n"): # pour chaque ligne
    if line.startswith("<item>"): # si la ligne contient l'annotation d'un token
        fields = re.findall("<a>([^<]+)</a>", line) # on cherche toutes les étiquettes
        idx, word, lemma, tag, _, _, head, rel, _, _ = fields # on récupère les étiquettes
        lemma = clean(lemma) # nettoyage des lemmes
        sent_buf[idx] = lemma # on associe chaque mot à sa position
        if rel == relation: # si il a la relation voulu
            rel_buf.append((lemma, head)) # on l'ajoute dans le buffer avec la position du gouverneur
    if line == "</p>": # si la ligne marque la fin d'une phrase
        for rel_lemma, head in rel_buf: # pour chaque relation trouvée
            couples.add((f"{sent_buf[head]}", f"{rel_lemma}")) # on ajoute le couple dans le dictionnaire
        rel_buf = [] # on remet les buffers à zéro
        sent_buf = {}

# FORMATAGE DU L'OUTPUT
print("@Gouv: #id, label") # noms des noeuds et sommets des gouverneurs
for lemme in {gov for gov, _ in couples}: # on transforme en ensemble pour éviter les doublons qui peuvent être gov de plusieurs dep
    print(f"g_{lemme},{lemme}") # affichage du lemme et de son id

print("@GDep: #id, label") # idem pour les dépendants
for lemme in {dep for _, dep in couples}:
    print(f"d_{lemme},{lemme}")

print(f"_{rel}:") # idem pour les couples de relations
for gouv, dep in couples:
    print(f"g_{gouv},--,d_{dep}")