#!/usr/bin/env python3
import pathlib
import shutil
import subprocess
import sys

import xml.etree.ElementTree as etree

from datetime import datetime, timedelta

from xeplib import load_xepinfos, Status


def do_archive(xeps_dir, attic, xep, old_version, new_version):
    curr_file = xeps_dir / "xep-{:04d}.html".format(xep)
    attic_file = attic / "xep-{:04d}-{}.html".format(xep, new_version)

    print("XEP-{:04d}:".format(xep), old_version, "->", new_version)

    subprocess.check_call(["make", "build/xep-{:04d}.html".format(xep)])

    shutil.copy(str(curr_file), str(attic_file))


def main():
    import argparse

    parser = argparse.ArgumentParser(
        description="Show the XEPs which need to be changed to deferred."
    )

    parser.add_argument(
        "old",
        type=argparse.FileType("rb"),
        help="Old XEP list"
    )

    parser.add_argument(
        "new",
        type=argparse.FileType("rb"),
        help="New XEP list"
    )

    parser.add_argument(
        "-d", "--xeps-dir",
        type=pathlib.Path,
        default=pathlib.Path.cwd() / "build",
        help="Path to the built XEPs (defaults to ./build)"
    )

    parser.add_argument(
        "-a", "--attic",
        type=pathlib.Path,
        default=pathlib.Path.cwd() / '../xep-attic/content/',
        help="Path to the attic (defaults to ../xep-attic/content/)"
    )

    parser.add_argument(
        "xeps",
        nargs="*",
        type=int,
        help="Additional XEPs (by their number) to archive. Useful for "
        "purely editorial changes."
    )

    args = parser.parse_args()

    with args.old as f:
        old_tree = etree.parse(f)

    old_accepted, _ = load_xepinfos(old_tree)

    with args.new as f:
        new_tree = etree.parse(f)

    new_accepted, _ = load_xepinfos(new_tree)

    changed = False

    force_archive = set(args.xeps)

    for xep, new_info in new_accepted.items():
        old_version = old_accepted.get(xep, {}).get("last_revision", {}).get(
            "version"
        )
        new_version = new_info["last_revision"]["version"]

        if old_version == new_version:
            continue

        force_archive.discard(xep)
        do_archive(args.xeps_dir, args.attic, xep, old_version, new_version)
        changed = True

    for xep in force_archive:
        old_version = old_accepted.get(xep, {}).get("last_revision", {}).get(
            "version"
        )
        new_version = new_accepted[xep]["last_revision"]["version"]

        do_archive(args.xeps_dir, args.attic, xep, old_version, new_version)
        changed = True

    if changed:
        print(
            "{}: do not forget to commit & push the attic!".format(
                sys.argv[0]
            ),
            file=sys.stderr
        )
    else:
        print("{}: nothing to do".format(sys.argv[0]),
              file=sys.stderr)


if __name__ == "__main__":
    main()