#!/usr/bin/env python

from __future__ import print_function

import json
import os
import subprocess
import sys

brew_conflicting = ["json-c"]
brew_required = [
    "boost", "cmake", "dcmtk", "icu4c", "jsoncpp", "pkg-config", "pybind11"
]
brew_required.append(
    "python{}".format("@2" if os.environ["Python"] == 2 else ""))

pip_required = ["nose"]

def get_formula_info(formula):
    try:
        info = json.loads(
            subprocess.check_output(["brew", "info", "--json=v1", formula]))
    except subprocess.CalledProcessError:
        return None

    if len(info) > 1:
        print("Too many formulas matching {}".format(formula))
        sys.exit(1)
    elif len(info) == 0:
        return None
    else:
        return info[0]

for formula in brew_conflicting:
    info = get_formula_info(formula)
    if info is not None and info["installed"]:
        print("Removing conflicting formula: {}".format(formula))
        subprocess.check_call(["brew", "unlink", formula])

for formula in brew_required:
    info = get_formula_info(formula)
    if info is None:
        raise Exception("No such formula: {}".format(formula))

    action = None
    if not info["installed"]:
        action = "install"
    elif not info["installed"][-1]["version"].startswith(info["versions"]["stable"]):
        action = "upgrade"

    if action is not None:
        subprocess.check_call(["brew", action, formula])

subprocess.check_call(
    ["pip"+os.environ["Python"], "install", "-U"]+pip_required)
