#!/usr/bin/env python
# encoding: utf-8

import urllib.request
from lxml import etree
from packaging.version import parse as parse_version
import re, sys, json

ARCHIVE = "https://downloadarchive.documentfoundation.org/libreoffice/old/"
RELEASE = "https://download.documentfoundation.org/libreoffice/stable/"
DAILY = "https://dev-builds.libreoffice.org/daily/master/Linux-rpm_deb-x86_64@tb87-TDF/current/"

def getlatestrel(basever):
    """Search in downloadarchive for the latest version matching baseversion."""
    versionlist = etree.HTML(urllib.request.urlopen(ARCHIVE).read()).xpath('//td/a')
    # Getting a more polished matching list
    cleanlist = list(dict.fromkeys([x.text.strip('/') for x in versionlist if x.text.startswith(basever)]))

    # Sorting, then returning the last version
    return sorted(cleanlist)[-1]

def getbranchrel(branch):
    """Based on branch names, get the release number."""
    basedirurl = {}
    version = ''
    if branch == 'daily':
        basedirurl = { 'x86_64': DAILY, 'x86': '-' }
        version = etree.HTML(urllib.request.urlopen(DAILY).read()).xpath('//td/a')[1].text.split('_')[1]

        return { 'version': version, 'basedirurl': basedirurl }
        
    versions = etree.HTML(urllib.request.urlopen(RELEASE).read()).xpath('//td/a')
    index = 1
    if branch ==  'still':
        index = 2
    elif branch == 'fresh':
        index = 3
    version = getlatestrel(versions[index].text.strip('/'))

    return { 'version': version, 'basedirurl': getbaseurl(version) }

def getbaseurl(version):
    """Returns the links based on the numeric version."""
    basediriurl = {}
    url = ARCHIVE + '/' + version + '/deb/'
    # x86 binaries are not anymore offered after 6.3.0.
    if parse_version(version) < parse_version('6.3.0'):
        basedirurl['x86'] = url + 'x86/'
    else:
        basedirurl['x86'] = '-'
    
    basedirurl['x86_64'] = url + 'x86_64/'

    return basedirurl

if __name__ == '__main__':
    # Preparing variables for outputting
    version = ''
    basedirurl = {}
    basever = 'fresh'
    
    # At the end of the checks, we need a version string and a basedirurl, which
    # should be a dictionaly for x86, x86_64 with the base of the directory where
    # to download the files.
    if len(sys.argv) > 1:
        # A version has been specified.
        basever = sys.argv[1]
    
    # Once overridden with Argv, parse the inputs
    if '.' in basever:
        # Numbered version.  Let's check it is a 4 dotted release
        if len(basever.split('.')) == 4:
            version = basever
        else:
            version = getlatestrel(basever)
        
        basedirurl = getbaseurl(version)
    else:
        # String versions.
        a = getbranchrel(basever)
        version = a['version']
        basedirurl = a['basedirurl']

    output = """RUNDECK:DATA: query = %s
RUNDECK:DATA: version = %s
RUNDECK:DATA: x86 = %s
RUNDECK:DATA: x86_64 = %s"""  % (basever, version, basedirurl['x86'] or '-', basedirurl['x86_64'])
print(output)