#!/usr/bin/python3

import argparse
from pathlib import Path, PurePath
import re

DLL_EXCLUSIONS_REGEX = r"(System|Microsoft|Mono|IronPython|DiscordRPC)\."

def getAssemblyReferences(path):
    asmDir = Path(path)
    result = list()
    for child in asmDir.iterdir():
        if child.is_file() and re.search(DLL_EXCLUSIONS_REGEX, str(child), re.I) is None and str(child).lower().endswith(".dll"):
            result.append(str(child).replace("\\", "/"))
    return result

def buildReferencesXml(path):
    assemblyPathes = getAssemblyReferences(path)
    result = list()
    for asm in assemblyPathes:
        asmPath = str(asm)
        xml = "    <Reference Include=\"" + asmPath[asmPath.rfind("/") + 1:].replace(".dll", "") + "\">\n" \
            + "      <HintPath>" + asmPath.replace("/", "\\") + "</HintPath>\n" \
            + "      <HintPath>..\\" + asmPath.replace("/", "\\") + "</HintPath>\n" \
            + "    </Reference>\n"
        result.append(xml)
    return "<!--Start Dependencies-->\n  <ItemGroup>\n" + "".join(result) + "  </ItemGroup>\n<!--End Dependencies-->"

if __name__ == "__main__":
    parser = argparse.ArgumentParser(description="Generate GamecraftModdingAPI.csproj")
    # TODO (maybe?): add params for custom csproj read and write locations
    args = parser.parse_args()
    
    print("Building Assembly references")
    asmXml = buildReferencesXml("../ref/Gamecraft_Data/Managed")
    # print(asmXml)
    
    with open("../GamecraftModdingAPI/GamecraftModdingAPI.csproj", "r") as xmlFile:
        print("Parsing GamecraftModdingAPI.csproj")
        fileStr = xmlFile.read()
        # print(fileStr)
        depsStart = re.search(r"\<!--\s*Start\s+Dependencies\s*--\>", fileStr)
        depsEnd = re.search(r"\<!--\s*End\s+Dependencies\s*--\>", fileStr)
        if depsStart is None or depsEnd is None:
            print("Unable to find dependency XML comments, aborting!")
            exit(1)
        newFileStr = fileStr[:depsStart.start()] + "\n" + asmXml + "\n" + fileStr[depsEnd.end() + 1:]
    with open("../GamecraftModdingAPI/GamecraftModdingAPI.csproj", "w") as xmlFile:
        print("Writing Assembly references (not)")
        xmlFile.write(newFileStr)
        # print(newFileStr)