#!/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:])
