#!/usr/bin/env python

import os
import sys
from typing import Dict
import argparse

VERSION_LINE_START = "__version__ = "

DIRECTORIES = [
    "ml-agents/mlagents/trainers",
    "ml-agents-envs/mlagents/envs",
    "gym-unity/gym_unity",
]


def extract_version_string(filename):
    with open(filename) as f:
        for l in f.readlines():
            if l.startswith(VERSION_LINE_START):
                return l.replace(VERSION_LINE_START, "").strip()
    return None


def check_versions() -> bool:
    version_by_dir: Dict[str, str] = {}
    for directory in DIRECTORIES:
        path = os.path.join(directory, "__init__.py")
        version = extract_version_string(path)
        print(f"Found version {version} for {directory}")
        version_by_dir[directory] = version

    # Make sure we have exactly one version, and it's not none
    versions = set(version_by_dir.values())
    if len(versions) != 1 or None in versions:
        print("Each setup.py must have the same VERSION string.")
        return False
    return True


def set_version(new_version: str) -> None:
    new_contents = f'{VERSION_LINE_START}"{new_version}"\n'
    for directory in DIRECTORIES:
        path = os.path.join(directory, "__init__.py")
        print(f"Setting {path} to version {new_version}")
        with open(path, "w") as f:
            f.write(new_contents)


if __name__ == "__main__":
    parser = argparse.ArgumentParser()
    parser.add_argument("--new-version", default=None)
    # unused, but allows precommit to pass filenames
    parser.add_argument("files", nargs="*")
    args = parser.parse_args()
    if args.new_version:
        print(f"Updating to verison {args.new_version}")
        set_version(args.new_version)
    else:
        ok = check_versions()
        return_code = 0 if ok else 1
        sys.exit(return_code)
