#!/usr/bin/env python

import os
import json

import click
import requests
from jinja2 import Template


@click.command()
@click.argument("path")
@click.option("--tags",
              multiple=True,
              help="Tags of PullRequest (Can be passed multiple times)")
@click.option("--token",
              help="GitHub API token. (Default env variable GITHUB_TOKEN)",
              default=os.environ.get("GITHUB_TOKEN", ""))
@click.option("--last-n-pr",
              help="Last n-th PullRequests",
              default=100)
def main(tags, token, path, last_n_pr):
    """
    Find what GitHub pull requests touch a given file.

    ex:
    ./find_pr.py --tags "language/fr" "content/fr/_index.html"
    """

    if not token:
        print("GitHub token not provided (required)")
        exit(1)

    query = Template("""
    query {
      repository(name: "website", owner: "kubernetes") {
        pullRequests({% if tags %}labels: [{% for tag in tags %}"{{ tag }}", {% endfor %}], {% endif %}last: {{ last_n_pr }}) {
          edges {
            node {
              title
              state
              url
              files (last: 100) {
                edges {
                  node {
                    path
                  }
                }
              }
            }
          }
        }
      }
    }
    """).render(tags=tags, last_n_pr=last_n_pr)

    try:
        r = requests.post("https://api.github.com/graphql",
                          json={"query": query},
                          headers={
                              "Authorization": "token %s" % token,
                              "Accept": "application/vnd.github.ocelot-preview+json",
                              "Accept-Encoding": "gzip"
                          })
        r.raise_for_status()

        reply = r.json()
        prs = reply['data']['repository']['pullRequests']['edges']

        for pr in prs:
            files = pr["node"]["files"]["edges"]
            for f in files:
                if path == f["node"]["path"]:
                    print("%s (%s)" % (pr["node"]["title"], pr["node"]["state"]))
                    print(pr["node"]["url"])
                    print("----------------")

    except requests.exceptions.HTTPError as err:
        gh_err_response = json.loads(err.response.text)
        print("HTTP Error: %d %s" % (err.response.status_code, gh_err_response['message']))
    except requests.exceptions.ConnectionError as err:
        print("Error Connecting: %s" % err)
    except requests.exceptions.Timeout as err:
        print("Timeout Error: %s" % err)
    except requests.exceptions.RequestException as err:
        print("Oops, another error occurred: %s" % err)

if __name__ == '__main__':
    main()