from propmeth import register
from pycon.propmgr.models import *
from django import template
from django.conf import settings
from django.contrib.sites.models import Site
from pycon.restructuredtext import restructuredtext
import string

@register.inclusion_tag('propmgr/proposal_link.html', takes_context=True)
def include_proposal_link(context, proposal, link=True):
    sub_context = {'proposal': proposal, 'link': link,
               'user': context['user'], 'settings': context['settings']}
    return sub_context

@register.inclusion_tag('propmgr/proposal_link.html', takes_context=True)
def include_proposal_title(context, proposal, link=False):
    return include_proposal_link(context, proposal, link)

@register.filter
def site_absolute_url(obj):
    site = Site.objects.get_current()
    return u'http://' + site.domain + obj.get_absolute_url()

@register.filter
def fixupcat(catname):
    return catname.replace('_', ' ')

@register.filter
def format_change_message(message):
    if not message.startswith('*'):
        # we are an admin entry
        message = ('* Admin edit:\n\n    | ' +
                   '    | '.join(message.splitlines(True)) + '\n')
    return restructuredtext(message)

@register.filter
def fmtuser(user, format):
    try:
        return string.Template(format).safe_substitute(user.__dict__)
    except:
        if settings.TEMPLATE_DEBUG:
            raise
    return settings.TEMPLATE_STRING_IF_INVALID

@register.filter
def preserveindentbr(text):
    return '<br/>'.join(('&nbsp;' * (len(l) - len(l.lstrip()))) + l.lstrip()
                        for l in text.split('\n'))

@register.filter
def minus(first, second):
    return first - second

class VarNode(template.Node):
    def __init__(self, var_name, var_to_resolve):
        self.var_name = var_name
        self.var_to_resolve = var_to_resolve
    def get_context(self, top_context):
        for context in top_context.dicts:
            if self.var_name in context:
                return context
        return top_context
    def render(self, context):
        try:
            resolved_var = template.resolve_variable(self.var_to_resolve,
                                                     context)
            self.get_context(context)[self.var_name] = resolved_var
        except template.VariableDoesNotExist:
            self.get_context(context)[self.var_name] = ''
        return ''


@register.tag
def var(parser, token):
    '''
    {% var foo = expression %}
    {% var foo = Model.foo_set.count %}
    {% var foo = foo|restructuredtext %}
    {{ foo }} {{ foo|escape }}
    '''

    args = token.split_contents()
    if len(args) != 4 or args[2] != '=':
        raise template.TemplateSyntaxError(
            "'%s' statement requires the form {% %s foo = bar %}." % (
                args[0], args[0]))
    return VarNode(args[1], args[3])
