#!/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
import datetime

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

orgs = {
  'affiliatewp',
  'easydigitaldownloads',
  'restrictcontentpro',
  'sugarcalendar',
  'wpsimplepay',
  'sellbirdhq'
}

date_format = '%Y-%m-%dT%H:%M:%S%z'
last_meetup = datetime.datetime.strptime("2018-09-29T23:59:59Z", date_format)

github_urls = {
  'repos': 'https://api.github.com/orgs/{org}/repos', # GET
  'teams': 'https://api.github.com/orgs/{org}/teams', # GET
  'releases': 'https://api.github.com/repos/{org}/{repo}/releases'
}

gh_payload = {'access_token': settings.GITHUB_TOKEN}


# Get our teams, let the user pick one.
company_total = 0
for organization in orgs:
  print("##### " + organization + ' #####')
  org_total = 0

  # Get the first page.
  head = requests.get(github_urls['repos'].format(
    org=organization), gh_payload)

  # 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):

      repo_payload = gh_payload.copy()
      repo_payload['page'] = page

      # headers = { 'Accept': 'application/vnd.github.drax-preview+json' }
      headers = {}

      r = requests.get(github_urls['repos'].format(
        org=organization), repo_payload, headers=headers)

      existing_projects = json.loads(r.text)

      for existing_project in existing_projects:
        repo_total = 0
        # Get the first page.
        releases_head = requests.get(github_urls['releases'].format(
          org=organization, repo=existing_project['name']), gh_payload)

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

        if releases_last_page != 0:

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

            releases_payload = gh_payload.copy()
            releases_payload['page'] = page

            rr = requests.get(github_urls['releases'].format(
              org=organization, repo=existing_project['name']), releases_payload, headers=headers)

            if (rr.status_code == 200) :

              releases = json.loads(rr.text)

              for release in releases:
                if isinstance(release['published_at'], str):
                  release_date = release['published_at']
                  release_date = datetime.datetime.strptime(release_date, date_format)
                  if ( release_date > last_meetup ):
                    repo_total = repo_total + 1


        print(existing_project['name'] + " releases: " + str(repo_total))
        org_total = org_total + repo_total

              #team_payload = gh_payload.copy()
              #team_payload['permission'] = permission
              #repo_r = requests.put(github_urls['teamrepo'].format(
              #  org=settings.GITHUB_ORG,
              #  repo=existing_project['name'],
              #  teamid=team_id
              #), params=gh_payload, data=json.dumps(team_payload))

    print("##### " + organization + ': ' + str(org_total))
    company_total = company_total + org_total

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

print("###### Company Total: " + str(company_total) + " ######")
