#! /usr/bin/python
import sys, os, json, re

def write_identation(identation_count,file):
    cc = "\n"
    for i in range(identation_count): cc += "\t"
    file.write(cc)

def help():
    print("""A simple utility for converting all Audacity's "label.txt" files 
in this project to a more convenient JSON format, and vice versa

Usage: python json_converter.py [-option]
-tj      Convert all "label.txt" files to "labels.jsonc"
-jt      Convert all "label.json" files to "labels.txt"
    """)
    return 1

def txt_to_json():
    for dir in os.listdir():
        if os.path.isfile(dir): continue

        file_list = os.listdir(dir)
        if not "labels.txt" in file_list:
            print(f'There is no "labels.txt" file in {dir} dir')
            continue

        with open(os.path.join(dir,"labels.txt"),'r') as f:
            og_labels = f.read()

        label_list = og_labels.split('\n')

        labels = {}
        last_id = ""
        for i in label_list:
            # if it has an ID
            if len(i.split('\t')) != 3: continue
            if i.split("\t")[2].find("[") != 0:
                last_id = i.split("\t")[2][:i.split("\t")[2].find("[")]
                labels[last_id] = [{
                    "start_t":i.split("\t")[0],
                    "end_t":i.split("\t")[1],
                    "moles":json.loads(i.split("\t")[2][i.split("\t")[2].find("["):])
                }]

            else:
                labels[last_id].append({
                    "start_t":i.split("\t")[0], 
                    "end_t":i.split("\t")[1],
                    "moles":json.loads(i.split("\t")[2])
                })
        
        json_txt = json.dumps(labels)
        identation_count = 0
        max_bracket_count = 5
        bracket_count = 0
        with open(os.path.join(dir,"labels.jsonc"),'w') as f:
            ignore_flag = False
            for c_i in range(len(json_txt)):
                if ignore_flag:
                    ignore_flag = False
                    continue

                c = json_txt[c_i]
                if c == '}' or c == ']':
                    identation_count -= 1
                    if bracket_count < max_bracket_count:
                        write_identation(identation_count,f)                    
                    bracket_count -= 1
                                    
                f.write(c)

                if c == '[' or c == '{':
                    identation_count += 1
                    bracket_count += 1
                    if bracket_count < max_bracket_count:
                        write_identation(identation_count,f)
                    
                if c == ',':

                    if bracket_count < max_bracket_count:
                        write_identation(identation_count,f)
                    
                    if c_i+1 < len(json_txt) and json_txt[c_i+1] == ' ': 
                        ignore_flag = True
                                    
    return 0

def json_to_txt():
    for dir in os.listdir():
        if os.path.isfile(dir): continue

        file_list = os.listdir(dir)
        if not "labels.jsonc" in file_list:
            print(f'There is no "labels.jsonc" file in {dir} dir')
            continue

        with open(os.path.join(dir,"labels.jsonc"),"r") as f:
            f_content = f.read()

        # elimina los comentarios
        f_content = re.sub(r'//.*', '', f_content) # // 
        f_content = re.sub(r'/\*.*?\*/', '', f_content, flags=re.DOTALL) # /**/
        labels_json = json.loads(f_content)

        with open(os.path.join(dir,"labels.txt"),"w") as f:
            for id, labels in labels_json.items():
                for label_index in range(len(labels)):
                    label = labels[label_index]
                    f.write(f"{label["start_t"]}\t{label["end_t"]}\t{id if label_index == 0 else ""}{json.dumps(label["moles"])}\n")

def main():
    if "-tj" in sys.argv:
        return txt_to_json()
    
    if "-jt" in sys.argv:
        return json_to_txt()
    
    return help()

if __name__ == "__main__":
    sys.exit(main())