from threading import Thread

from django.conf import settings
from django.core.mail import EmailMultiAlternatives
from django.template.loader import render_to_string as render


class EmailThread(Thread):
    def __init__(self, subject, text, html, to, headers):
        Thread.__init__(self)
        self.subject = subject
        self.text = text
        self.html = html
        self.to = to
        self.headers = headers

    def run(self):
        msg = EmailMultiAlternatives(self.subject, self.text, to=(self.to, ),
                                     headers=self.headers)

        msg.attach_alternative(self.html, "text/html")
        msg.send()


def send(name, to, ctx, headers={}):
    ctx["SITE_ROOT"] = settings.SITE_ROOT

    subject = render('emails/%s-subject.html' % name, ctx).strip()
    text = render('emails/%s-body-text.html' % name, ctx)
    html = render('emails/%s-body-html.html' % name, ctx)

    t = EmailThread(subject, text, html, to, headers)
    if hasattr(settings, "BLOCKING_EMAILS"):
        t.run()
    else:
        t.start()


def login(to, ctx):
    send("login", to, ctx)


def set_password(to, ctx):
    send("set-password", to, ctx)


def change_email(to, ctx):
    send("change-email", to, ctx)


def alert(to, ctx, headers={}):
    send("alert", to, ctx, headers)


def verify_email(to, ctx):
    send("verify-email", to, ctx)


def report(to, ctx, headers={}):
    send("report", to, ctx, headers)


def invoice(to, ctx, filename, pdf_data):
    ctx["SITE_ROOT"] = settings.SITE_ROOT
    subject = render('emails/invoice-subject.html', ctx).strip()
    text = render('emails/invoice-body-text.html', ctx)
    html = render('emails/invoice-body-html.html', ctx)

    msg = EmailMultiAlternatives(subject, text, to=(to, ))
    msg.attach_alternative(html, "text/html")
    msg.attach(filename, pdf_data, "application/pdf")
    msg.send()


def deletion_notice(to, ctx, headers={}):
    send("deletion-notice", to, ctx, headers)