#!/usr/bin/env python
"""Make a pull request from HEAD"""

from __future__ import print_function
from argparse import ArgumentParser
from subprocess import check_call, check_output, Popen, PIPE, CalledProcessError
import sys
import re
import os
import yaml

import github3

CONFIG_PATH = "~/.config/hub"
OWNER = "rohanpm"
REPO = "more-executors"


def github_session():
    with open(os.path.expanduser(CONFIG_PATH)) as f:
        hub_config = yaml.load(f)

    creds = hub_config.get("github.com", [])
    if not creds:
        raise RuntimeError("Login with 'hub' command first")
    if len(creds) != 1:
        raise RuntimeError("Unexpected content in %s" % CONFIG_PATH)

    token = creds[0].get("oauth_token")
    if not token:
        raise RuntimeError("Missing token in %s" % CONFIG_PATH)

    return github3.login(token=token)


def run(raw_args):
    parser = ArgumentParser()
    parser.add_argument("name", help="name for branch")
    parser.add_argument(
        "--remove-branch",
        action="store_true",
        help="remove branch if it already exists",
    )
    parser.add_argument(
        "--skip-rebase", action="store_true", help="do not rebase on master before push"
    )
    parser.add_argument("-m", help="pull-request message")
    args = parser.parse_args(raw_args)

    if args.remove_branch:
        try:
            check_call(["git", "branch", "-D", args.name])
        except CalledProcessError:
            pass

    check_call(["git", "checkout", "-b", args.name])

    if not args.skip_rebase:
        check_call(["git", "fetch", "origin"])
        check_call(["git", "rebase", "-i", "origin/master"])

    check_call(["git", "push", "-f", "--set-upstream", "origin", args.name])

    pr_cmd = ["hub", "pull-request"]
    if args.m:
        pr_cmd.extend(["-m", args.m])

    check_call(pr_cmd)


if __name__ == "__main__":
    run(sys.argv[1:])
