#!/usr/bin/env python3

__doc__ = """
Determines asymptote version for release, or with git info for development
"""
__author__ = "Supakorn 'Jamie' Rassameemasmuang <[email protected]>"

import pathlib
import re
import subprocess
from argparse import ArgumentParser
from subprocess import CalledProcessError

from determine_pkg_info import determine_asy_pkg_info


def parse_args():
   parser = ArgumentParser()
   parser.add_argument(
       "--base-version",
       type=str,
       help="Base version string. If blank, this information is "
       + "fetched from configure.ac",
   )
   version_mode = parser.add_mutually_exclusive_group()
   version_mode.add_argument("--version-for-release", action="store_true")
   version_mode.add_argument(
       "--version-with-git-info",
       action="store_true",
       help="Includes number of commits since last tag, if directory is a git repo. "
       + "If commit information cannot be determined, reverts to baseline version",
   )

   return parser.parse_args()


def determine_version_for_release(version_base: str):
   git_string = "git"
   if version_base.endswith("git"):
       return version_base[: -len(git_string)]
   return version_base


def determine_version_with_git_info(version_base: str):
   try:
       long_description = subprocess.run(
           ["git", "describe", "--long"],
           cwd=pathlib.Path(__file__).parent,
           check=True,
           stderr=subprocess.DEVNULL,
           stdout=subprocess.PIPE,
           text=True,
       )
   except CalledProcessError:
       return version_base

   first_version_base = re.sub(r"git-([0-9]*)-g.*", r"-\1", long_description.stdout)
   return re.sub(r"-0-g.*", r"", first_version_base)


def main():
   args = parse_args()
   version_base = args.base_version or determine_asy_pkg_info()["version-base"]

   if args.version_for_release:
       version = determine_version_for_release(version_base)
   elif args.version_with_git_info:
       version = determine_version_with_git_info(version_base)
   else:
       version = version_base

   print(version, end="")


if __name__ == "__main__":
   main()