#!/usr/bin/env python3

import os
import os.path
import re
from inspect import getsourcefile

from xml.dom import minidom

from distutils.version import StrictVersion

MYPATH = os.path.dirname(os.path.abspath(getsourcefile(lambda:0)))
DOAPS = os.path.join(os.path.dirname(MYPATH), 'doap')

def CommonsVersion(v):
    # Massage the suffixes to satisfy StrictVersion
    v1 = re.sub(r'-beta-?', "b", v)
    v1 = re.sub(r'-rc', "a", v1)
    v1 = re.sub(r'-alpha', "a", v1)
    v1 = re.sub(r'-[mM]', "b", v1)
#   if v != v1:
#       print v,v1

    # This compares numbers correctly and treats [ab]\d+ suffix as earlier than ones without
    return(StrictVersion(v1))

def getText(parent):
    rc = []
    for node in parent.childNodes:
        if node.nodeType == node.TEXT_NODE:
            rc.append(node.data)
    return ''.join(rc)

def getReleaseInfo(path):
    rels = minidom.parse(path).getElementsByTagName('release')

    latest_version = None
    latest_date = None

    for rel in rels:
        revision = None
        created = None
        for ver in rel.childNodes: # these must be Version elements
            if isinstance(ver, minidom.Element):
                for child in ver.childNodes:
                    if isinstance(child, minidom.Element):
                        tag = child.tagName.lower()
                        if tag in ['version', 'revision']:
                            revision = getText(child)
                        if tag == 'created':
                            created = getText(child)
        if latest_version == None or CommonsVersion(revision) > CommonsVersion(latest_version):
            latest_version = revision
            latest_date = created
    return latest_version, latest_date


f = open(os.path.join(MYPATH, 'component_releases.properties'), 'w+')

for name in sorted(os.listdir(DOAPS)):
    comp_name = name[5:-4] # drop doap_ prefix and .rdf suffix
    version, date = getReleaseInfo(os.path.join(DOAPS, name))
    print(comp_name, version, date)
    if version != None:
        f.write(comp_name + 'Version=' + version + '\n')
        f.write(comp_name + 'Released=' + date + '\n')
    else: # should not happen unless DOAP syntax is wrong
        f.write(comp_name + 'Version=N/A\n')
        f.write(comp_name + 'Released=N/A\n')

f.close()
