import os, sys
import xml.etree.ElementTree as ET
from xml.dom import minidom
import traceback
import sys

def main():
    # Create corpus structure from string and save into file 
    corpus = "<teiCorpus>\n</teiCorpus>"
    origRoot = ET.fromstring(corpus)
    corpusStr = minidom.parseString(ET.tostring(origRoot)).toprettyxml(indent="  ")
    if not os.path.exists('input'):
        os.makedirs("input")
    if not os.path.exists('output'):
        os.makedirs("output")
    with open("input/tree_structure.xml", "w") as f:
        f.write(corpusStr)

    # Parse corpus tree
    corpusTree = ET.parse("input/tree_structure.xml")
    corpusRoot = corpusTree.getroot()

    # Process documents and append to corpus tree
    for j in range(1, len(sys.argv)):
      try:
         currentTree = convert(j-1, sys.argv[j])
         currentRoot = currentTree.getroot()
         corpusRoot.append(currentRoot)
      except:
         print("ERROR:"+sys.argv[j])
         print(traceback.format_exc())
         print(sys.exc_info()[2])
         continue

    # Indent and save tree
    ET.indent(corpusTree, "  ")
    corpusTree.write("output/GA_corpus.p5.xml", encoding='utf-8', xml_declaration=True, method='xml', short_empty_elements=True)


def convert(j, file):
    # Parse document tree and get root
    tree = ET.parse(file)
    root = tree.getroot()
    ET.register_namespace("", "http://www.tei-c.org/ns/1.0")
 
    # Store metadata and texts in lists
    titles = root.find(".//*{http://www.tei-c.org/ns/1.0}bibl/{http://www.tei-c.org/ns/1.0}title")
    uris = root.find(".//*{http://www.tei-c.org/ns/1.0}bibl/{http://www.tei-c.org/ns/1.0}pubPlace")
    authors = root.findall(".//*{http://www.tei-c.org/ns/1.0}bibl/{http://www.tei-c.org/ns/1.0}author")
    txtPublisher = root.find(".//*{http://www.tei-c.org/ns/1.0}bibl/{http://www.tei-c.org/ns/1.0}publisher")
    licenses = root.findall(".//*{http://www.tei-c.org/ns/1.0}availability/{http://www.tei-c.org/ns/1.0}licence")
    
    dates = root.find(".//*{http://www.tei-c.org/ns/1.0}bibl/{http://www.tei-c.org/ns/1.0}date")
    texts = root.findall(".//*{http://www.tei-c.org/ns/1.0}body/{http://www.tei-c.org/ns/1.0}div")
    domains = root.find(".//*[@type]")

    # Count text elements 
    number_of_texts = 0
    for text in root.iter("{http://www.tei-c.org/ns/1.0}text"):
        for body in text:
            for div in body:
                number_of_texts+=1

    number_of_texts = len(texts)
    # Remove all elements from root
    for elem in root.findall("*"):
        root.remove(elem)

    # Rename root
    root.tag = "teiDoc"
    
    # Create target structure
    for i in range(number_of_texts):
        tei = ET.SubElement(root, "TEI")
        teiHeader = ET.SubElement(tei, "teiHeader")
        fileDesc = ET.SubElement(teiHeader, "fileDesc")
        titleStmt = ET.SubElement(fileDesc, "titleStmt")
        textSigle = ET.SubElement(titleStmt, "textSigle")
        textSigle.text = "GA/" + f"{j:03}" + "." + f"{i:05}"
        sourceDesc = ET.SubElement(fileDesc, "sourceDesc")
        analytic = ET.SubElement(sourceDesc, "analytic")
        title = ET.SubElement(titleStmt, "title")
        title.text = titles.text
        
        print(textSigle.text, end='\n')
        
        #adding changes to detect multiple authors
        for author in authors :
            hauthor = ET.SubElement(analytic, "h.author")
            hauthor.text = author.text
            #print(hauthor.text, end='\n')
        imprint = ET.SubElement(sourceDesc, "imprint")

        #adding publisher 

        print('Publisher : ',txtPublisher.text, end='\n')
        if txtPublisher is None:
            print('Publisher : ',txtPublisher.text, end='\n')
        else :
            publisher = ET.SubElement(imprint, "publisher")
            publisher.text = txtPublisher.text

        #adding licenses
        for license in licenses:
            print('License : ',license.text,end='\n')

        pubDateYear = ET.SubElement(imprint, "pubDate")
        pubDateYear.set("type", "year")
        pubDateYear.text = dates.text
        pubDateMonth = ET.SubElement(imprint, "pubDate")
        pubDateMonth.set("type", "month")
        #pubDateMonth.text = datesPublished[i].text
        pubDateDay = ET.SubElement(imprint, "pubDate")
        pubDateDay.set("type", "day")
        #pubDateDay.text = datesPublished[i].text
        pubPlace = ET.SubElement(imprint, "pubPlace")
        idno = ET.SubElement(pubPlace, "idno")
        idno.set("type", "URI")
        idno.text = uris.text
        domain = ET.SubElement(titleStmt, "domain")
        domain.text = domains.get("type")
        '''
        splitFName = file.split("/")
        if (splitFName[-2] in ['Persuasive', 'Blog']):
            domain.text = splitFName[-2]
        elif(splitFName[-4] != "Originaldaten"):
            domain.text = splitFName[-4] + ':' + splitFName[-3] + ':' + splitFName[-2]
        else:
            domain.text = splitFName[-3] + ':' + splitFName[-2]
        '''
        domain.text = domain.text.replace("_hobbies", "_Hobbies")
        text = ET.SubElement(tei, "text")
        text.append(texts[i])  
        

    return tree


main()