import json
import py
import textwrap

issues_url = "https://api.github.com/repos/pytest-dev/pytest/issues"

import requests


def get_issues():
    issues = []
    url = issues_url
    while 1:
        get_data = {"state": "all"}
        r = requests.get(url, params=get_data)
        data = r.json()
        if r.status_code == 403:
            # API request limit exceeded
            print(data['message'])
            exit(1)
        issues.extend(data)

        # Look for next page
        links = requests.utils.parse_header_links(r.headers['Link'])
        another_page = False
        for link in links:
            if link['rel'] == 'next':
                url = link['url']
                another_page = True
        if not another_page:
            return issues


def main(args):
    cachefile = py.path.local(args.cache)
    if not cachefile.exists() or args.refresh:
        issues = get_issues()
        cachefile.write(json.dumps(issues))
    else:
        issues = json.loads(cachefile.read())

    open_issues = [x for x in issues if x["state"] == "open"]

    open_issues.sort(key=lambda x: x["number"])
    report(open_issues)


def _get_kind(issue):
    labels = [l['name'] for l in issue['labels']]
    for key in ('bug', 'enhancement', 'proposal'):
        if key in labels:
            return key
    return 'issue'


def report(issues):
    for issue in issues:
        title = issue["title"]
        body = issue["body"]
        kind = _get_kind(issue)
        status = issue["state"]
        number = issue["number"]
        link = "https://github.com/pytest-dev/pytest/issues/%s/" % number
        print("----")
        print(status, kind, link)
        print(title)
        #print()
        #lines = body.split("\n")
        #print ("\n".join(lines[:3]))
        #if len(lines) > 3 or len(body) > 240:
        #    print ("...")
    print("\n\nFound %s open issues" % len(issues))


if __name__ == "__main__":
    import argparse
    parser = argparse.ArgumentParser("process bitbucket issues")
    parser.add_argument("--refresh", action="store_true",
                        help="invalidate cache, refresh issues")
    parser.add_argument("--cache", action="store", default="issues.json",
                        help="cache file")
    args = parser.parse_args()
    main(args)

