# Validate that all entries in the .pot are in every .po. Only the .pot is updated so we can detect
# if a translation was added to the source but isn't in a .po. This ensures translators can grab
# complete files to work on.

import git
import sys
import polib

po_filenames = sys.argv[1:]
repo = git.Repo()

NO_TRANSLATION_WHITELIST = ["ffi_prep_closure_loc"]

bad_commits = {}
for po_filename in po_filenames:
    print("Checking", po_filename)

    commits = repo.iter_commits(paths=po_filename, reverse=True, topo_order=True)
    first_translations = None
    fixed_ids = set()
    for commit in commits:
        try:
            blob = commit.tree / po_filename
        except KeyError:
            continue
        try:
            current_file = polib.pofile(blob.data_stream.read().decode("utf-8"))
        except OSError:
            print("skipping invalid po in", commit)
            continue
        if not first_translations:
            first_translations = current_file
            continue
        print(commit.authored_date, commit)
        first_translations.metadata = current_file.metadata
        first_translations.header = current_file.header
        for entry in first_translations:
            newer_entry = current_file.find(entry.msgid)

            if newer_entry and entry.msgid == "":
                entry.merge(newer_entry)
                print(entry)
            elif newer_entry and entry.msgstr != newer_entry.msgstr:
                if newer_entry.msgstr != "" and (newer_entry.msgstr != entry.msgid or entry.msgid in NO_TRANSLATION_WHITELIST):
                    entry.merge(newer_entry)
                    entry.msgstr = newer_entry.msgstr
                    if "fuzzy" not in newer_entry.flags and "fuzzy" in entry.flags:
                        entry.flags.remove("fuzzy")
                elif entry.msgid not in fixed_ids:
                    if commit not in bad_commits:
                        bad_commits[commit] = set()
                    bad_commits[commit].add(po_filename)
                    fixed_ids.add(entry.msgid)
                    #print(entry.msgid, "\"" + entry.msgstr + "\"", "\"" + newer_entry.msgstr + "\"",)
            elif newer_entry and newer_entry.flags != entry.flags:
                entry.flags = newer_entry.flags
            elif newer_entry and newer_entry.obsolete != entry.obsolete:
                entry.obsolete = newer_entry.obsolete
            elif not newer_entry:
                entry.obsolete = True

        # Add new entries to the modified pofile.
        for entry in current_file:
            old_entry = first_translations.find(entry.msgid, include_obsolete_entries=True)
            if old_entry:
                continue
            first_translations.append(entry)

    # Remove obsolete translations. We can always use this script to revive them from the git history.
    to_remove = []
    for entry in first_translations:
        if entry.obsolete:
            to_remove.append(entry)

    for remove in to_remove:
        first_translations.remove(remove)

    first_translations.save(po_filename)

print()
for commit in bad_commits:
    files = bad_commits[commit]
    print(commit)
    for file in files:
        print("\t",file)
