#!/usr/bin/env python
# vim: set filetype=python

import argparse
import subprocess
import re
import git

from releasemaker.releasemaker import ReleaseMaker

call_command = lambda args: subprocess.check_output(args.split()).strip()

def commit_sha(value):
    repo = git.Repo()
    try:
        repo.commit(value)
    except git.exc.BadName as e:
        message = "{} is not a valid ref.".format(value)
        raise argparse.ArgumentTypeError(message)
    else:
        return value


if __name__ == "__main__":
    parser = argparse.ArgumentParser(prog='releasemaker')

    api_key_default = call_command("security find-internet-password -s api.github.com -w")

    parser.add_argument("--organization", required=True)
    parser.add_argument("--repository", required=True)
    parser.add_argument("--api-key", help="Your GitHub API token. Defaults to value on OS X keychain.", default=api_key_default)
    parser.add_argument("--start-commit", help="The first commit to draw release notes from.", required=True, type=commit_sha)
    parser.add_argument("paths", metavar='PATH', type=str, nargs='*', help="An optional file to upload along with the release.")

    api_key = call_command("security find-internet-password -s api.github.com -w")

    args = parser.parse_args()
    if api_key == "":
        api_key = args.api_key

    if None in [api_key, args.organization, args.repository, args.start_commit]:
        parser.print_help()
    else:
        release_maker = ReleaseMaker(api_key, args.organization, args.repository)

        try:
            version = call_command("agvtool what-marketing-version -terse1")
            bundle = call_command("agvtool what-version -terse")
        except subprocess.CalledProcessError:
            parser.error("This tool must be run in a directory containing an Xcode project file.")
        else:
            success = release_maker.create(version, bundle, args.start_commit, args.paths)
            if success:
                parser.exit(message="Release created.")
            else:
                parser.exit(message="Release was not created.")

