from __future__ import absolute_import

import pylons, tg
import urllib2

from . import latex, custom, util
from bazbase import custom as basecust
from bazbase import dependencies, conversion, structure
from bazbase.translators import TRANSLATORS, Intermed

# '.foo' is a complete file, 'foo' is a document fragment

TRANSLATORS.setdefault('.pdf',{})['.tex'] = lambda im: latex.typeset(
    im, format='.pdf')
TRANSLATORS.setdefault('.ps',{})['.tex'] = lambda im: latex.typeset(
    im, format='.ps')

# We could leave off the protocol/hostname here sometimes, but not going to
# bother until we have a usecase.
def url(path, dep=None, prefixtype='', render=None):
    if path.startswith('/'):
        path = absolute_url(path, dep, prefixtype=prefixtype, render=render)
    return path
def unurl(url):
    try:
        script_name = conversion.render_propval(u'UrlConfig',
                                                u'prefix').split('://', 1)[1]
    except KeyError:
        if '://' in url:
            url = url.split('://', 1)[1]
            host, url = url.split('/', 1)
            url = '/' + url
    else:
        if '://' in url:
            url = url.split('://', 1)[1]
            assert url.startswith(script_name), url
            url = url[len(script_name):]
        elif '/' in script_name:
            host, path = script_name.split('/', 1)
            path = '/' + path
            assert url.startswith(path), (url, path)
            url = url[len(path):]
    assert url.startswith('/'), url
    return url
def absolute_url(path, dep=None, prefixtype='', render=None):
    url_config = u'UrlConfig'
    prefix = prefixtype + u'prefix'
    assert path.startswith('/')
    path = path.encode('utf-8')
    try:
        # raw, so don't need to worry about recursive deps
        uc = structure.get_element(url_config)
        if uc is None:
            # TODO(xavid): warning of some sort?
            return path
        if dep:
            dep.addPropvalDep(uc, prefix)
        if render is not None:
            rendered = render(uc, prefix)
        else:
            rendered = conversion.render_raw(url_config, prefix)
        return rendered + path
    except KeyError:
        # TODO(xavid): warning of some sort?
        return path

def edit_url(ename_or_path, dep=None, prefixtype='', render=None):
    return absolute_url('/edit/' + ename_or_path,
                        dep=dep, prefixtype=prefixtype, render=render)

_template_lookup = None
# Template processing
def __template_trans(format):
    def template_trans(im):
        from mako.template import Template
        metadata = im.metadata()
        elm = metadata.get('element', None)
        let = metadata.get('let',{})
        title = "Welcome to %s!" % basecust.APP_NAME
        if 'title' in metadata:
            title = metadata['title']
        elif elm is not None:
            elm = structure.get_element(elm)
            im.addPropvalDep(elm, u'title')
            im.addPropvalDep(elm, u'name')
            filters = {}
            if 'let' in metadata:
                filters['let'] = metadata['let']
            if elm.has_propval(u'title'):
                title = conversion.render(elm, u'title', filters=filters)
            elif elm.has_propval(u'name'):
                title = conversion.render(elm, u'name', filters=filters)
        extra_args = custom.get_template_parameters(format, im.getDeps())
        if elm is not None:
            extra_args['element'] = elm
        if 'pdfurl' in metadata:
            extra_args['pdfurl'] = metadata['pdfurl']
        body = im.asData()
        if not isinstance(body, unicode):
            body = unicode(body, 'utf-8')
        template_elm = structure.get_element_raw({u'format': format,
                                                  u'mako': structure.NOT_BLANK})
        template_text = template_elm.get_prop('mako')
        im.setData(Template(template_text, output_encoding='utf-8')
                   .render(body=body,
                           addDep=lambda dep:im.deps.add(dep),
                           DISCORDIA=dependencies.DISCORDIA,
                           let=let,
                           title=title,
                           **extra_args), '.'+format)
    TRANSLATORS.setdefault('.'+format,{})[format] = template_trans
for format in ('html','tex'):
    __template_trans(format)
