#!/usr/bin/env nix-shell
#!nix-shell -p nix -p python3 -p git -i python
# USAGE - just run the script: ./update.py
# When editing this file, make also sure it passes the mypy typecheck
# and is formatted with yapf.
import urllib.request
import json
import tempfile
import subprocess
import fileinput
import re
from pathlib import Path


def sh(*args: str) -> str:
    out = subprocess.check_output(list(args))
    return out.strip().decode("utf-8")


def prefetch_github(owner: str, repo: str, ref: str) -> str:
    return sh("nix-prefetch-url", "--unpack",
              f"https://github.com/{owner}/{repo}/archive/{ref}.tar.gz")


def main() -> None:
    url = "https://api.github.com/repos/radare/radare2/releases/latest"
    with urllib.request.urlopen(url) as response:
        release = json.load(response)  # type: ignore
    version = release["tag_name"]
    with tempfile.TemporaryDirectory() as dirname:

        def git(*args: str) -> str:
            return sh("git", "-C", dirname, *args)

        git("clone", "--branch", version, "https://github.com/radare/radare2",
            ".")
        sha256 = prefetch_github("radare", "radare2", version)
        nix_file = str(Path(__file__).parent.joinpath("default.nix"))

        cs_tip = None
        with open(Path(dirname).joinpath("shlr", "Makefile")) as makefile:
            for l in makefile:
                match = re.match("CS_TIP=(\S+)", l)
                if match:
                    cs_tip = match.group(1)
        assert cs_tip is not None

        cs_sha256 = prefetch_github("aquynh", "capstone", cs_tip)

        in_block = False
        with fileinput.FileInput(nix_file, inplace=True) as f:
            for l in f:
                if "#<generated>" in l:
                    in_block = True
                    print(f"""  #<generated>
  # DO NOT EDIT! Automatically generated by ./update.py
  version_commit = "{git("rev-list", "--all", "--count")}";
  gittap = "{git("describe", "--tags", "--match", "[0-9]*")}";
  gittip = "{git("rev-parse", "HEAD")}";
  version = "{version}";
  sha256 = "{sha256}";
  cs_tip = "{cs_tip}";
  cs_sha256 = "{cs_sha256}";
  #</generated>""")
                elif "#</generated>" in l:
                    in_block = False
                elif not in_block:
                    print(l, end="")


if __name__ == "__main__":
    main()
