# Utils for dealing with wiki-based config parameters
from __future__ import absolute_import

from bazbase import Element, NoResultFound

import re

CAPPAT = re.compile(r'_([a-z])')

def get_prop(role,dep=None):
    caprole = CAPPAT.sub(lambda m:m.group(1).upper(),role).capitalize()
    ename = caprole+u'Property'
    if dep is not None:
        dep.add((ename,u'propname'))
    try:
        e=Element.get(ename)
    except NoResultFound:
        return role
    if u'propname' in e:
        return unicode(e[u'propname'].value,'utf-8')
    else:
        return role
    
ELEMENT_DEFAULTS = {u'top':u"DocumentationHome"}

def get_element(elm,dep=None,meta=False):
    capelm = CAPPAT.sub(lambda m:m.group(1).upper(),elm).capitalize()
    ename = capelm+u'Element'
    if dep is not None:
        dep.add((ename,u'propname'))
    try:
        e = Element.get(ename)
    except NoResultFound:
        pass
    else:
        if u'ename' in e:
            return unicode(e[u'ename'].value,'utf-8') 
    if elm in ELEMENT_DEFAULTS:
        return ELEMENT_DEFAULTS[elm]
    elif meta:
        return elm
    else:
        return capelm

GLOBAL_DEFAULTS = {u'appname':u'Bazki'}

def get_global(param,dep=None):
    ename = u"AppConfig"
    if dep is not None:
        dep.add((ename,param))
    e = Element.get(ename)
    if e and param in e:
        return e[param].render()
    elif param in GLOBAL_DEFAULTS:
        return GLOBAL_DEFAULTS[param]
    else:
        return u'<<%s.%s/>>' % (ename,param)
