#!/usr/bin/env python3

# Exports a CSV of repo names, readme files, and the license of the project.

from __future__ import print_function
import requests
import json
import settings
from urllib.parse import urljoin
from urllib.parse import urlparse
from urllib import parse
import sys
from github import repos
from helpers.choices import prompt
from helpers.clear import clear

org = 'awesomemotive'

def getLastPage(link_header):
  links = link_header.split(',')
  for link in links:
    link = link.split(';')
    if link[1].strip() == 'rel="last"':
      # Trim it for garbage, and get the url params out.
      link_data = parse.parse_qs(link[0].strip(' <>'))
      last_page = int(link_data['page'][0])
      return last_page
  return 0

def generate():
    repo = repos.list(False)

    # Once a repo is selected, get a list of milestones
    milestone = get_milestones(repo)

    # Get the milestone data and issues
    milestone_data = get_milestone_data(repo, milestone)

def get_milestones(repo):
    # Define the headers
    headers = {
        'Authorization': f'token {settings.GITHUB_TOKEN}',
        'Accept': 'application/vnd.github.v3+json'
    }

    # Define the API endpoint for each repository
    url = f'https://api.github.com/repos/{org}/{repo}/milestones'

    # Define the parameters, to only get open milestones
    params = {
        'state': 'open'
    }

    # Get the list of milestones
    response = requests.get(url, headers=headers, params=params)
    milestones = response.json()

    # Print the list of milestones for the user to select.
    milestone_options = []
    for milestone in milestones:
        milestone_options.append(milestone['title'])

    selected = prompt('Select a milestone:', milestone_options)

    # Return the selected milestone
    return milestones[int(selected) - 1]['number']


def get_milestone_data(repo, milestone):
    clear()

    github_urls = {
        'milestone': 'https://api.github.com/repos/{org}/{repo}/milestones/{milestone}', # GET
        'issues': 'https://api.github.com/repos/{org}/{repo}/issues',
    }

    # Get the milestone data
    headers = { 'Accept': 'application/vnd.github.drax-preview+json', 'Authorization': 'token {github_token}'.format(github_token=settings.GITHUB_TOKEN) }
    milestone_data_raw = requests.get(github_urls['milestone'].format(
    org=org,repo=repo,milestone=milestone), headers=headers)

    milestone_data = json.loads(milestone_data_raw.content);
    if milestone_data['open_issues'] != 0 :
        print('Milestone still has open issues, listing currently closed issues')
    else:
        print('Milestone is code complete, building changelog for PR')

    # Build the table header.
    print('| Issue # | Description |')
    print('|---------|-------------|')

    # Now loop through the issues to link them.
    # Get the first page.
    issues_payload = {}
    issues_payload['milestone'] = milestone
    issues_payload['state'] = 'closed'
    head = requests.get(github_urls['issues'].format(
        org=org,repo=repo), issues_payload, headers=headers)

    # Look for the last page link in the headers
    last_page = 1
    if 'link' in head.headers:
        last_page = getLastPage(head.headers['link'])

    if last_page != 0:

        for page in range(1, last_page + 1):

            issues_payload['page'] = page

            headers = { 'Accept': 'application/vnd.github.drax-preview+json', 'Authorization': 'token {github_token}'.format(github_token=settings.GITHUB_TOKEN) }

            issue_data = requests.get(github_urls['issues'].format(
                org=org,repo=repo), issues_payload, headers=headers)

            issues = json.loads(issue_data.text)
            for issue in issues:
                print('| #' + str(issue['number']) + ' | ' + issue['title'] + ' |')

            print('Done.')
    else:
        print('Didn\'t find any issues.', file=sys.stderr)
