#!/usr/bin/env python3
#
# This script reads a syntaxTest file and writes all
# sources into their own files. If one source-name specifies subdirectories
# those will be created too.

# Usage: scripts/splitSources.py pathToTestfile
# as a result prints
# -  string of created files separated by whitespaces
# -  'false' if the file only had one source

import sys
import os
import traceback

hasMultipleSources = False
createdSources = []


def uncaught_exception_hook(exc_type, exc_value, exc_traceback):
    # The script `scripts/ASTImportTest.sh` will interpret return code 3
    # as a critical error (because of the uncaught exception) and will
    # terminate further execution.
    print("Unhandled exception: %s", "".join(traceback.format_exception(exc_type, exc_value, exc_traceback)))
    sys.exit(3)


def extractSourceName(line):
    if line.find("/") > -1:
        filePath = line[13: line.rindex("/")]
        # fileName = line[line.rindex("/")+1: line.find(" ====")]
        srcName = line[line.find(":")+2: line.find(" ====")]
        return filePath, srcName
    return False, line[line.find(":")+2 : line.find(" ====")]


# expects the first line of lines to be "==== Source: sourceName ===="
# writes the following source into a file named sourceName
def writeSourceToFile(lines):
    filePath, srcName = extractSourceName(lines[0])
    # print("sourceName is ", srcName)
    # print("filePath is", filePath)
    if filePath != False:
        os.system("mkdir -p " + filePath)
    with open(srcName, mode='a+', encoding='utf8', newline='') as f:
        createdSources.append(srcName)
        i = 0
        for idx, line in enumerate(lines[1:]):

            # write to file
            if line[:12] != "==== Source:":
                f.write(line)

            # recursive call if there is another source
            else:
                writeSourceToFile(lines[1+idx:])
                break


if __name__ == '__main__':
    filePath = sys.argv[1]
    sys.excepthook = uncaught_exception_hook

    try:
        # decide if file has multiple sources
        with open(filePath, mode='r', encoding='utf8', newline='') as f:
            lines = f.read().splitlines()
        if lines[0][:12] == "==== Source:":
            hasMultipleSources = True
            writeSourceToFile(lines)

        if hasMultipleSources:
            srcString = ""
            for src in createdSources:
                srcString += src + ' '
            print(srcString)
            sys.exit(0)
        else:
            sys.exit(1)

    except UnicodeDecodeError as ude:
        print("UnicodeDecodeError in '" + filePath + "': " + str(ude))
        print("This is expected for some tests containing invalid utf8 sequences. "
              "Exception will be ignored.")
        sys.exit(2)
