from django.core.management.base import NoArgsCommand
from django.template import RequestContext, Context, loader
from django.contrib.sites.models import Site

SUBJECT = "%(site)s proposal #%(prop_id)i decision"
TEMPLATE = { 'A': 'propmgr/email/proposal_accepted.txt',
             'D': 'propmgr/email/proposal_declined.txt' }

class Command(NoArgsCommand):
    help = ''

    def handle_noargs(self, **options):
        from django.db import models
        from django.conf import settings
        from pycon.core import mail
        if not hasattr(settings, 'PROPMGR_EMAIL'):
            raise CommandError(
                "Could not find PROPMGR_EMAIL in settings.")
        try:
            app = models.get_app('propmgr')
        except (ImproperlyConfigured, ImportError), e:
            raise CommandError(
                "%s. Are you sure your INSTALLED_APPS setting is correct?" % e)

        for key, val in TEMPLATE.iteritems():
            TEMPLATE[key] = loader.get_template(val)

        proposals = app.Proposal.objects.filter(published=False,
                                                status__in=['A', 'D'])
        mailings = []
        print "Rendering messages"
        for  prop in proposals:
            author_emails = [ prop.submitter.email ]
            author_emails.extend(auth.email for auth in prop.coauthors.all())
            t = TEMPLATE[prop.status]
            message = t.render(Context({ 'proposal': prop,
                                         'settings': settings }))
            mailings.append((SUBJECT % {
                'site': getattr(settings, 'CONFERENCE_NAME', ''),
                'prop_id': prop.id},
                             message, settings.PROPMGR_EMAIL, author_emails))
        print "Sending messages"
        sent = mail.send_mass_mail(mailings)
        print "Sent", sent, "messages."
        print "Marking proposals published."
        for prop in proposals:
            prop.published = True
            prop.save()
        print "Marked", len(proposals), "proposals published."
