import pylons, tg

from redbeans.parser import Parser
from bazbase.wiki import (macros, WikiException, eval_state, parse_macro_args,
                          macro_func, link_func, makeRestricted, unicode_eval)
from bazbase import flavors
from redbeans.tokens import *
from redbeans.extracting import ExtractingFormat
from . import util

EMAIL = Style('EMAIL')

def tgconfig(arglist):
    yield Text(unicode(tg.config[arglist[0]]))
macros.tgconfig = tgconfig

def email(arglist, content):
    import textwrap
    
    args = parse_macro_args(arglist)
    req_args = ('subject', 'from', 'to')
    opt_args = ('cc', 'attachment')
    for req in req_args:
        if req not in args:
            raise WikiException("##email## missing required arg '%s'!" % req)

    for k in args:
        if k not in req_args and k not in opt_args:
            raise WikiException("##email## does not support arg '%s'!" % k)
        args[k] = unicode_eval(args[k])

    parser = Parser(flavors.FORMATS['txt'], macro_func, link_func,
                    makeRestricted)
    msg = parser.render(content)

    # TODO(xavid): this is a hack
    msgbits = msg.split('\n')
    msgbits = [textwrap.fill(m, break_long_words=False, break_on_hyphens=False)
               # if '://' not in m else m 
               for m in msgbits]
    msg = '\n'.join(msgbits)

    if eval_state.format == EMAIL_FORMAT:
        args['msg'] = msg
        yield Entity(EMAIL, args)
    else:
        from bazjunk import email
        yield Start(CODEBLOCK)
        def argtext(a):
            if a.lower() in args:
                return Text(u"%s: %s\n" % (a, args[a.lower()]))
            else:
                return ''
        yield argtext('Subject')
        yield argtext('From')
        yield argtext('To')
        yield argtext('CC')
        yield Entity(LINEBREAK)
        yield Text(msg)
        yield End(CODEBLOCK)

    #util.send_email(msg, subject, from_addr, to_addr)
macros.email = email

# This maybe should go in custom, but this file already has side effects
# upon import.
EMAIL_FORMAT = ExtractingFormat(EMAIL)
class email_flavor(flavors.flavor):
    @staticmethod
    def toPython(wikitext, parser, propval=None):
        return list(parser.iparse(wikitext, format=EMAIL_FORMAT))

    @staticmethod
    def evaluate(wikitext, parser, propval=None):
        # This is a hack to deal with our lack of stringishness.
        return email_flavor.toPython(wikitext, parser, propval=propval)
flavors.FLAVORS['email'] = email_flavor
flavors.FORMATS['email'] = EMAIL_FORMAT
