#!/usr/bin/env python3

import os
import argparse
import glob
import polib
import logging
import requests

logging.basicConfig(level=logging.INFO,
                    format="%(levelname)8s  [%(asctime)s %(name)15s:%(module)s:%(lineno)4d] \t  %(message)s")
logging.getLogger().setLevel(logging.INFO)


def translate(text, language, source_language, api_key):
    response = requests.post(
        "https://translation.googleapis.com/language/translate/v2",
        json={
            "q": text,
            "target": language,
            "source": source_language
        },
        params={
            "key": api_key
        })
    if not response.ok:
        response.raise_for_status()
    response = response.json()
    translations = response.get('data', {}).get('translations')
    return translations[0].get('translatedText') if translations else None


if __name__ == '__main__':
    parser = argparse.ArgumentParser(description='Automatically search and translate all Django PO files')
    parser.add_argument('--path', type=str, nargs='?',
        help='The default path to process, if not provided current directory')
    parser.add_argument('--google-api-key', type=str, required=True,
        help='API key to use for google translation')
    parser.add_argument('--clear', dest='clear', action='store_true',  help='Indicate if all translations need to be reset')
    parser.set_defaults(clear=False)

    args = parser.parse_args()

    for filename in glob.iglob(os.path.join(args.path or "", '**/LC_MESSAGES/django.po'), recursive=True):
        locale_key = filename.split("/")[-3]

        logging.info(f'Processing .po file for language {locale_key}: {filename}')

        po_file = polib.pofile(filename)
        for entry in po_file:
            if args.clear:
                entry.msgstr = ""
                logging.info(f'Clearing: {entry.msgid}')

            elif not entry.translated():
                entry.msgstr = translate(
                    entry.msgid,
                    language=locale_key,
                    source_language='en',
                    api_key=args.google_api_key
                )
                logging.info(f'Translated: "{entry.msgid}" -> {entry.msgstr}')

        po_file.save(filename)
