from django.core.management.base import BaseCommand, CommandError
from itertools import chain
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?%=:./]+)?)')
BIO=u'''=h=%(name)s=h=

%(bio)s

'''

BIO_AF=u'''=h=%(name)s=h=

**%(affiliation)s**

%(bio)s

'''

HACK = { u'': BIO }

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

def user_to_full(u):
    res = { 'name': unicode(u), 'affiliation': u'', 'bio': u''}
    prof = None
    prof = u.get_profile()
    if prof:
        res['bio'] = prof.bio
        if prof.affiliation:
            res['affiliation']=prof.affiliation
    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 at least one appname.')

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

        f = file(args[0],'wb')
        f.write("=t=Talk Presenter Biographies=t=\n\n=b= =b=\n\n")
        coauths = models.User.objects.filter(
                                      proposals_coauthored_set__status='A',
                                      proposals_coauthored_set__published=True
                                     ).order_by(
                                        'id').distinct().exclude(userprofile__bio='')
        coauthids = [ c['id'] for c in coauths.values('id') ]
        auths = models.User.objects.filter(
                                    proposals_submitted_set__status='A',
                                    proposals_submitted_set__published=True
                                    ).distinct().exclude(userprofile__bio='',
                                            id__in=coauthids)

        for entry in (format(**u) for u in (user_to_full(u)
                for u in sorted(chain(coauths, auths),
                                key=lambda u: u.last_name)) if u['bio']):
            f.write(entry.encode('utf-8'))
