#!/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")

  print("#########################")
  print("# Stringtable Diag Tool #")
  print("#########################")

  languages = get_all_languages(projectpath)

  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

    print("\n# " + module)

    keysum += keynumber
    for i in range(len(localized)):
      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)

  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 ###")

  print("\nTotal 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)))

if __name__ == "__main__":
  main()