#!/bin/sh
''''[ ! -z $VIRTUAL_ENV ] && exec python -u -- "$0" ${1+"$@"}; command -v python3 > /dev/null && exec python3 -u -- "$0" ${1+"$@"}; exec python2 -u -- "$0" ${1+"$@"} # '''

import sys
import os
import argparse
import json
import traceback

try:
    from urllib2 import urlopen
except:
    from urllib.request import urlopen

HERE = os.path.dirname(__file__)
READIES = os.path.abspath(os.path.join(HERE, ".."))
sys.path.insert(0, READIES)
import paella  # noqa: F401

#----------------------------------------------------------------------------------------------

def no_v(v):
    return v[1:] if v.startswith('v') else v

#class PartialVersion(Version):
#    def __init__(self, *args, **kwargs):
#        kwargs['partial'] = True
#        super(PartialVersion, self).__init__(*args, **kwargs)

#----------------------------------------------------------------------------------------------

def read_github_versions(org, repo):
    j = []
    url = 'https://api.github.com/repos/{ORG}/{REPO}/tags?per_page=100'.format(ORG=org, REPO=repo)
    while True:
        r = urlopen(url)
        if r.code != 200:
            raise RuntimeError('cannot read Redis version list from guthub')
        t = r.read()
        try:
            t = t.decode()
        except (UnicodeDecodeError, AttributeError):
            pass
        j1 = json.loads(t)
        j += j1
        if r.headers["link"] == "":
            break

        if r.headers["link"] is None:
            break
        links0 = r.headers["link"].split(",")
        links1 = list(map(lambda a: list(map(lambda b: str.strip(b), a.split(';'))), links0))
        next_link = list(filter(lambda x: x[1] == 'rel="next"', links1))
        if next_link == []:
            break
        url = next_link[0][0][1:-1]
    return list(filter(lambda v: v[:1].isdigit(), map(lambda v: no_v(v['name']), j)))

def get_github_versions(org, repo, version):
    redis_versions = read_github_versions(org, repo)
    redis_versions.sort(key=paella.Version, reverse=True)
    if version is None or version == "":
        return redis_versions
    if version in redis_versions:
        return [version]

    sv = paella.Version(no_v(version))
    if sv.patch is not None:
        # this would fail, as the fully qualified version is not in redis_versions
        version = str(sv)
        return [version]

    if sv.minor is None:
        br='{}'.format(sv.major)
    else:
        br = '{}.{}'.format(sv.major, sv.minor)
    # select the latest version of the major.minor branch
    return list(filter(lambda v: v.startswith(br + '.'), redis_versions)) 

#----------------------------------------------------------------------------------------------

parser = argparse.ArgumentParser(description='Get latest Github repo version')
parser.add_argument('-o', '--org', type=str, default="", help='Github organization')
parser.add_argument('-r', '--repo', type=str, default="", help='Github repository')
parser.add_argument('-v', '--version', type=str, default="", help='Version prefix')
args = parser.parse_args()

x = args.repo.split('/')
if args.org == "" and len(x) == 2:
    args.org = x[0]
    args.repo = x[1]

try:
    versions = get_github_versions(org=args.org, repo=args.repo, version=args.version)
    if len(versions) == 0:
        exit(1)
    print(versions[0])
    exit(0)
except Exception as x:
    traceback.print_exc()
    fatal(str(x))
