#!/usr/bin/env python3

"""
Creates the initial RDF for a new TLP

Reads:
data/committees/_template.rdf
committee-info.json from Whimsy

Updates:
data/committees.xml

Creates:
data/committees/<pmc>.rdf

"""

import sys
import os.path
import os
from string import Template
import re

if len(sys.argv) == 1:
    print("Please provide a list of project ids")
    sys.exit(1)

# This currently reads data at load time
import committee_info

# extract committees composition
print("Reading committee-info")
committees = committee_info.committees()

DATADIR = os.path.join(committee_info.COMDEV_HOME,'data')
RDFDIR = os.path.join(DATADIR,'committees')
RETIREDDIR = os.path.join(DATADIR,'committees-retired')
OVERRIDEDIR = os.path.join(DATADIR,'projects-override')


print("Reading _template.rdf")
tmpfile = os.path.join(RDFDIR,'_template.rdf')
with open(tmpfile,'r', encoding='utf-8') as t:
    template = Template(t.read())


def update_xml(pid):
    xmlfile = os.path.join(DATADIR,'committees.xml')
    xmlfilet = os.path.join(DATADIR,'committees.xml.t')
    print("Updating committees.xml")
    notYetFound = True
    with open(xmlfile,'r', encoding='utf-8') as r, open(xmlfilet,'w', encoding='utf-8') as w:
        for l in r:
            if notYetFound:
                m = re.search("^(\\s+)<location>committees/(.+)\\.rdf<",l)
                if m:
                    indent = m.group(1)
                    mid = m.group(2)
                    if mid > pid: # found insertion point
                        w.write("%s<location>committees/%s.rdf</location>\n" % (indent, pid))
                        notYetFound = False
                    elif mid == pid:
                        print("ERROR: committees.xml already contains %s" % pid)
                        w.close()
                        os.remove(xmlfilet)
                        return
                else:
                    if l.startswith("</list"): # EOF
                        w.write("%s<location>committees/%s.rdf</location>\n" % (indent, pid))
                        notYetFound = False
            w.write(l) # write the original line
    os.rename(xmlfilet,xmlfile)

for arg in sys.argv[1:]:
    print("Processing "+arg)
    outfile = os.path.join(RDFDIR,"%s.%s"%(arg,'rdf'))
    if os.path.exists(outfile):
        print("RDF file for %s already exists!" % arg)
        continue
    oldrdf = os.path.join(RETIREDDIR,"%s.%s"%(arg,'rdf'))
    if os.path.exists(oldrdf):
        print("%s exists - sorry cannot handle exit from Attic" % oldrdf)
        continue
    oldrdf = os.path.join(OVERRIDEDIR,"%s.%s"%(arg,'rdf'))
    if os.path.exists(oldrdf):
        print("%s exists - sorry cannot handle exit from Attic" % oldrdf)
        continue
    try:
        cttee = committees[arg]
        if cttee['description']:
            data = {
                "id": arg,
                "site": cttee['site'],
                "fullname": cttee['fullname'],
                "description": cttee['description'],
            }
            out = template.substitute(data)
            print("Creating "+outfile)
            with open(outfile,'w', encoding='utf-8') as o:
                o.write(out)
            os.system("svn add %s" % outfile)
            update_xml(arg)
        else:
            print("No description found for "+arg)
    except KeyError:
        print("Cannot find "+arg)

os.system("svn diff %s" % DATADIR)
