#!/usr/bin/env python3
# -*- coding: utf-8 -*-

"""
Check translation lacked or disused.

Example:
in OnionShare directory
$ check_lacked_trans.py
de disused choose_file
de disused gui_starting_server
de lacked gui_canceled
de lacked gui_starting_server1
de lacked gui_starting_server2
de lacked gui_starting_server3
en disused choose_file
es disused choose_file
es disused gui_starting_server
...


1. search `{{strings.translation_key}}` and `strings._('translation_key')`
   from .py or .html files.
2. load translation key from locale/*.json.
3. compare these.

"""


import argparse
import re
import os
import codecs
import json
import sys


def arg_parser():
    desc = __doc__.strip().splitlines()[0]
    p = argparse.ArgumentParser(description=desc)
    p.add_argument(
        "-d",
        default=".",
        help="onionshare directory",
        metavar="ONIONSHARE_DIR",
        dest="onionshare_dir",
    )
    p.add_argument(
        "--show-all-keys",
        action="store_true",
        help="show translation key in source and exit",
    ),
    p.add_argument(
        "-l",
        default="all",
        help="language code (default: all)",
        metavar="LANG_CODE",
        dest="lang_code",
    )
    return p


def files_in(*dirs):
    dir = os.path.join(*dirs)
    files = os.listdir(dir)
    return [os.path.join(dir, f) for f in files]


def main():
    parser = arg_parser()
    args = parser.parse_args()

    dir = args.onionshare_dir

    src = (
        files_in(dir, "onionshare_gui")
        + files_in(dir, "onionshare_gui/tab")
        + files_in(dir, "onionshare_gui/tab/mode")
        + files_in(dir, "onionshare_gui/tab/mode/chat_mode")
        + files_in(dir, "onionshare_gui/tab/mode/receive_mode")
        + files_in(dir, "onionshare_gui/tab/mode/share_mode")
        + files_in(dir, "onionshare_gui/tab/mode/website_mode")
        + files_in(dir, "install/scripts")
    )
    filenames = [p for p in src if p.endswith(".py")]

    lang_code = args.lang_code

    translate_keys = set()
    for filename in filenames:
        # load translate key from python source
        with open(filename) as f:
            src = f.read()

        # find all the starting strings
        start_substr = "strings._\("
        starting_indices = [m.start() for m in re.finditer(start_substr, src)]

        for starting_i in starting_indices:
            # are we dealing with single quotes or double quotes?
            quote = None
            inc = 0
            while True:
                quote_i = starting_i + len("strings._(") + inc
                if src[quote_i] == '"':
                    quote = '"'
                    break
                elif src[quote_i] == "'":
                    quote = "'"
                    break
                else:
                    inc += 1

            # find the starting quote
            starting_i = src.find(quote, starting_i)
            if starting_i:
                starting_i += 1
                # find the ending quote
                ending_i = src.find(quote, starting_i)
                if ending_i:
                    key = src[starting_i:ending_i]
                    translate_keys.add(key)

    if args.show_all_keys:
        for k in sorted(translate_keys):
            print(k)
        sys.exit()

    if lang_code == "all":
        locale_files = [f for f in files_in(dir, "share/locale") if f.endswith(".json")]
    else:
        locale_files = [
            f
            for f in files_in(dir, "share/locale")
            if f.endswith("%s.json" % lang_code)
        ]
    for locale_file in locale_files:
        with codecs.open(locale_file, "r", encoding="utf-8") as f:
            trans = json.load(f)
        # trans -> {"key1": "translate-text1", "key2": "translate-text2", ...}
        locale_keys = set(trans.keys())

        disused = locale_keys - translate_keys
        lacked = translate_keys - locale_keys

        locale, ext = os.path.splitext(os.path.basename(locale_file))
        for k in sorted(disused):
            print(locale, "disused", k)

        for k in sorted(lacked):
            print(locale, "lacked", k)


if __name__ == "__main__":
    main()
