from django.core.management.base import BaseCommand, CommandError
import re

DOUBLE_SLASH = re.compile('(?<!http:)//')
DOUBLE_TICK = re.compile('``')
DOUBLE_STAR = re.compile('\*\*')
LIST_STAR = [ re.compile('^\*(?=[^\*])', re.M),
              re.compile('(?<=^)\*(?=(?!\*))', re.M),
              re.compile('(?<=^\s)\*(?=(?!\*))', re.M),
              re.compile('(?<=^\s\s)\*(?=(?!\*))', re.M),
              re.compile('(?<=^\s\s\s)\*(?=(?!\*))', re.M),
              re.compile('(?<=^\s\s\s\s)\*(?=(?!\*))', re.M),
              re.compile('(?<=^\s\s\s\s\s)\*(?=(?!\*))', re.M),
              re.compile('(?<=^\s\s\s\s\s\s)\*(?=(?!\*))', re.M),
              re.compile('(?<=^\s\s\s\s\s\s\s)\*(?=(?!\*))', re.M),
              re.compile('(?<=^\s\s\s\s\s\s\s\s)\*(?=(?!\*))', re.M) ]
URL = re.compile('(http://)?(?P<url>(?P<host>[a-zA-Z0-9:.]+\.(com|org|net|au|uk|gov|us))(?P<uri>/[a-zA-Z0-9?%=:./]+)?)')

FORMAT=u'''=t=%(title)s (#%(id).3d)=t=

=b=%(authors)s=b=

**%(level)s %(duration)dmin**

**%(categories)s**

%(summary)s

'''

def format(**kwdargs):
    summary = DOUBLE_STAR.sub('\\**', kwdargs['summary'])
    for pat in LIST_STAR: summary = pat.sub('-', summary)
    if URL.search(summary): summary = URL.sub('[[http://\g<url>]]', summary)
    kwdargs['summary'] = summary
    base = FORMAT % kwdargs
    base = DOUBLE_SLASH.sub('\\//', base)
    base = DOUBLE_TICK.sub("''", base)
    return base

def user_to_full(u):
    res = unicode(u)
    prof = None
    try:
        prof = u.get_profile()
    except:
        pass
    if prof and prof.affiliation:
        res += u' (' + prof.affiliation + u')'
    return res

class Command(BaseCommand):
    args = '<filename>'
    
    def handle(self, *args, **options):
        from django.db import models
        from pycon.core import safe_ascii_encode
        if len(args) != 1:
            raise CommandError('Enter a valid output filename.')

        try:
            models = models.get_app('propmgr')
        except (ImproperlyConfigured, ImportError), e:
            raise CommandError(
                "%s. Are you sure your INSTALLED_APPS setting is correct?" % e)

        f = file(args[0],'wb')
        props = models.Proposal.objects.filter(status='A', published=True)
        for prop in props:
            authors = [ user_to_full(prop.submitter) ]
            authors.extend(user_to_full(u) for u in prop.coauthors.all())

            entry = format(id = prop.id,
                title = prop.title,
                categories = prop.categories,
                authors = u', '.join(authors),
                level = prop.get_level_display(),
                duration = prop.duration,
                summary = prop.summary)
            f.write(entry.encode('utf-8'))
