#!/usr/bin/python
'''
Fetches the labels of an Issue or Pull-Request from GitHub.

Parameters:
 --id=<id>: the number of the the GitHub Issue or Pull-Request
 --has-label=<label>: label to check (exit 0 if set, 2 unset), without
                      --has-label, all labels of the Issue or Pull-Request
                      get printed.

Exit codes:
 0: success
 1: any unexpected failure
 2: --has-label=<label> was passed, <label> is not set on the PR

Environment:
 GITHUB_API_TOKEN: the GitHub "personal access token" to use
'''

import argparse
import os
import requests
from requests.auth import HTTPBasicAuth
import sys

LABEL_URL_FMT = 'https://api.github.com/repos/ceph/ceph-csi/issues/%s/labels'
'''
Formatted URL for fetching the labels, replace '%s' with the number of  the
Issue or Pull-Request.
'''

def log_rate_limit(res):
    limit = -1
    if 'X-Ratelimit-Limit' in res.headers:
        limit = int(res.headers['X-Ratelimit-Limit'])

    remaining = -1
    if 'X-Ratelimit-Remaining' in res.headers:
        remaining = int(res.headers['X-Ratelimit-Remaining'])

    used = -1
    if 'X-Ratelimit-Used' in res.headers:
        used = int(res.headers['X-Ratelimit-Used'])

    print('Rate limit (limit/used/remaining): %d/%d/%d' % (limit, used, remaining))


def get_github_auth():
    auth = None

    if 'GITHUB_API_TOKEN' in os.environ:
        github_api_token = os.environ['GITHUB_API_TOKEN']
        if github_api_token != '':
            # the username "unused" is not relevant, needs to be non-empty
            auth = HTTPBasicAuth('unused', github_api_token)

    return auth


def get_json_labels(gh_id):
    '''
    Fetch the labels from GitHub, return the full JSON structures that were
    obtained. These include several ID's, color, decription, name and more.
    '''
    url = LABEL_URL_FMT % gh_id
    headers = {'Accept': 'application/vnd.github.v3+json'}
    res = requests.get(url, headers=headers, auth=get_github_auth())

    if res.status_code == 403:
        log_rate_limit(res)

    # if "res.status_code != requests.codes.ok", raise an exception
    res.raise_for_status()

    return res.json()


def get_names(gh_labels):
    '''
    Take the JSON formatted labels, and return a list of the name for each label.
    '''
    names = list()
    for label in gh_labels:
        names.append(label['name'])
    return names


def main():
    '''
    main() function to parse arguments and run the actions.
    '''
    parser = argparse.ArgumentParser()
    parser.add_argument('--id', type=int, required=True, help='ID of the Issue or Pull-Request')
    parser.add_argument('--has-label', help='check if the Issue or Pull-Request has the label set')
    args = parser.parse_args()

    # get the labels for the issue
    try:
        json = get_json_labels(args.id)
    except Exception as err:
        print('Error: %s' % err)
        sys.exit(1)

    names = get_names(json)

    # in case --has-label is passed, exit with 0 or 2
    if args.has_label:
        if args.has_label in names:
            sys.exit(0)
        else:
            sys.exit(2)
    # --has-label was not passed, list all labels
    else:
        for name in names:
            print(name)

    sys.exit(0)

if __name__ == '__main__':
    main()