#!/usr/bin/env python3

import os
import sys

from xml.dom import minidom

# STRINGTABLE DIAG TOOL
# Author: KoffeinFlummi
# ---------------------
# Checks for missing translations and all that jazz.

def get_all_languages(projectpath):
    """ Checks what languages exist in the repo. """
    languages = []

    for module in os.listdir(projectpath):
        if module[0] == ".":
            continue

        stringtablepath = os.path.join(projectpath, module, "stringtable.xml")
        try:
            xmldoc = minidom.parse(stringtablepath)
        except:
            continue

        keys = xmldoc.getElementsByTagName("Key")
        for key in keys:
            for child in key.childNodes:
                try:
                    if not child.tagName in languages:
                        languages.append(child.tagName)
                except:
                    continue

    return languages

def check_module(projectpath, module, languages):
    """ Checks the given module for all the different languages. """
    localized = []

    stringtablepath = os.path.join(projectpath, module, "stringtable.xml")
    try:
        xmldoc = minidom.parse(stringtablepath)
    except:
        return 0, localized

    keynumber = len(xmldoc.getElementsByTagName("Key"))

    for language in languages:
        localized.append(len(xmldoc.getElementsByTagName(language)))

    return keynumber, localized

def main():
    scriptpath = os.path.realpath(__file__)
    projectpath = os.path.dirname(os.path.dirname(scriptpath))
    projectpath = os.path.join(projectpath, "addons")

    if "--markdown" not in sys.argv:
        print("#########################")
        print("# Stringtable Diag Tool #")
        print("#########################")

    languages = get_all_languages(projectpath)

    if "--markdown" not in sys.argv:
        print("\nLanguages present in the repo:")
        print(", ".join(languages))

    keysum = 0
    localizedsum = list(map(lambda x: 0, languages))
    missing = list(map(lambda x: [], languages))

    for module in os.listdir(projectpath):
        keynumber, localized = check_module(projectpath, module, languages)

        if keynumber == 0:
            continue

        if "--markdown" not in sys.argv:
            print("\n# " + module)

        keysum += keynumber
        for i in range(len(localized)):
            if "--markdown" not in sys.argv:
                print("  %s %s / %i" % ((languages[i]+":").ljust(10), str(localized[i]).ljust(3), keynumber))
            localizedsum[i] += localized[i]
            if localized[i] < keynumber:
                missing[i].append(module)

    if "--markdown" not in sys.argv:
        print("\n###########")
        print("# RESULTS #")
        print("###########")
        print("\nTotal number of keys: %i\n" % (keysum))

        for i in range(len(languages)):
            if localizedsum[i] == keysum:
                print("%s No missing stringtable entries." % ((languages[i] + ":").ljust(12)))
            else:
                print("%s %s missing stringtable entry/entries." % ((languages[i] + ":").ljust(12), str(keysum - localizedsum[i]).rjust(4)), end="")
                print(" ("+", ".join(missing[i])+")")

        print("\n\n### MARKDOWN ###\n")

    print("Total number of keys: %i\n" % (keysum))

    print("| Language | Missing Entries | Relevant Modules | % done |")
    print("|----------|----------------:|------------------|--------|")

    for i, language in enumerate(languages):
        if localizedsum[i] == keysum:
            print("| {} | 0 | - | 100% |".format(language))
        else:
            print("| {} | {} | {} | {}% |".format(
                language,
                keysum - localizedsum[i],
                ", ".join(missing[i]),
                round(100 * localizedsum[i] / keysum, 2)))

if __name__ == "__main__":
    main()