#!/usr/bin/env python

r"""
Exports issues from a list of repositories to individual CSV files.
Uses basic authentication (GitHub username + password) to retrieve issues
from a repository that username has access to. Supports GitHub API v3.
"""
import argparse
import csv
import getpass
import requests

auth = None
states = 'all'


def write_issues(response, csv_out):
    r"""
    Parses JSON response and writes to CSV.
    """
    print response
    if response.status_code != 200:
        raise Exception(response.status_code)
    for issue in response.json():
        if 'pull_request' not in issue:
            labels = ', '.join([l['name'] for l in issue['labels']])

            # Below lines to overcome "TypeError: 'NoneType' object has
            # no attribute '__getitem__'"

            close_date = issue.get('closed_at')
            if close_date:
                close_date = issue.get('closed_at').split('T')[0]

            assignee_resp = issue.get('assignees', 'Not Assigned')
            if assignee_resp:
                owners = ','.join([assignee_login['login'] for
                                   assignee_login in assignee_resp])
            else:
                owners = "Not Assigned"

            milestone_resp = issue.get('milestone', 'Not Assigned')
            if milestone_resp:
                milestone_resp = milestone_resp['title'].encode('utf-8')

            # Change the following line to write out additional fields
            csv_out.writerow([labels.encode('utf-8'),
                             issue.get('title').encode('utf-8'),
                             issue.get('state').encode('utf-8'),
                             issue.get('created_at').split('T')[0],
                             close_date,
                             issue.get('html_url').encode('utf-8'),
                             issue.get('user').get('login').encode('utf-8'),
                             owners, milestone_resp])


def get_issues_from_github_to_csv(name, response):
    r"""
    Requests issues from GitHub API and writes to CSV file.
    Description of argument(s):
    name  Name of the GitHub repository
    response  GitHub repository response
    """
    print name
    print states

    # Multiple requests are required if response is paged
    if 'link' in response.headers:
        pages = {rel[6:-1]: url[url.index('<')+1:-1] for url, rel in
                 (link.split(';') for link in
                 response.headers['link'].split(','))}
        while 'last' in pages and 'next' in pages:
            pages = {rel[6:-1]: url[url.index('<')+1:-1] for url, rel in
                     (link.split(';') for link in
                     response.headers['link'].split(','))}
            response = requests.get(pages['next'], auth=auth)
            write_issues(response, csv_out)
            if pages['next'] == pages['last']:
                break


parser = argparse.ArgumentParser(description="Write GitHub repository issues "
                                             "to CSV file.")

parser.add_argument('username', nargs='?', help="GitHub user name, "
                    "formatted as 'username'")

parser.add_argument('repositories', nargs='+', help="Repository names, "
                    "formatted as 'basereponame/repo'")

parser.add_argument('--all', action='store_true', help="Returns both open "
                    "and closed issues.")

args = parser.parse_args()

if args.all:
    state = 'all'

username = args.username

password = getpass.getpass("Enter your GitHub Password:")

auth = (username, password)

# To set the csv filename
csvfilename = ""
for repository in args.repositories:
    csvfilename_temp = '{}'.format(repository.replace('/', '-'))
    csvfilename = csvfilename+csvfilename_temp
csvfilename = csvfilename+'-issues.csv'
with open(csvfilename, 'wb') as csvfileout:
    csv_out = csv.writer(csvfileout)
    csv_out.writerow(['Labels', 'Title', 'State', 'Open Date',
                      'Close Date', 'URL', 'Author', 'Assignees',
                      'Milestone'])
    for repository in args.repositories:
        l_url = 'https://api.github.com/repos/{}/issues?state={}'
        l_url = l_url.format(repository, states)
        response = requests.get(l_url, auth=auth)
        write_issues(response, csv_out)
        get_issues_from_github_to_csv(repository, response)
csvfileout.close()
