from os import remove
from re import compile

from django.conf import settings
from django.contrib.sites.models import Site
from django.template.response import HttpResponse
from django.views.generic import TemplateView

from wkhtmltopdf.utils import template_to_temp_file, wkhtmltopdf


class PDFResponse(HttpResponse):
    def __init__(self, content, filename):
        super(PdfResponse, self).__init__(content, 'application/pdf')
        self.__setitem__('Content-Disposition', 'attachment; filename=%s' % filename)


class PdfResponse(PDFResponse):
    def __init__(self, content, filename):
        warning = '''PdfTemplateView is deprecated in favour of PDFTemplateView. It will be removed in version 1.'''
        raise PendingDeprecationWarning(warning)
        super(PdfResponse, self).__init__(content, filename)


class PDFTemplateView(TemplateView):
    filename = 'rendered_pdf.pdf'
    footer_template = None
    header_template = None
    margin_bottom = 0
    margin_left = 0
    margin_right = 0
    margin_top = 0
    response = PDFResponse

    def get(self, request, context_instance=None, *args, **kwargs):
        if request.GET.get('as', '') == 'html':
            return super(PdfTemplateView, self).get(request, *args, **kwargs)

        page_path = template_to_temp_file(self.template_name, self.get_context_data(), context_instance)

        tmp_files = []
        if self.header_template:
            kwargs['header_html'] = template_to_temp_file(self.header_template, self.get_context_data(), context_instance)
            tmp_files.append(kwargs['header_html'])
        if self.footer_template:
            kwargs['footer_html'] = template_to_temp_file(self.footer_template, self.get_context_data(), context_instance)
            tmp_files.append(kwargs['footer_html'])

        map(remove, tmp_files)

        kwargs.update({
            'margin_bottom': self.margin_bottom,
            'margin_left': self.margin_left,
            'margin_right': self.margin_right,
            'margin_top': self.margin_top
        })
        return self.response(wkhtmltopdf(page_path, **kwargs), self.filename)

    def get_context_data(self, **kwargs):
        context = super(PdfTemplateView, self).get_context_data(**kwargs)

        match_full_url = compile(r'^https?://')
        if not match_full_url.match(settings.STATIC_URL):
            context['STATIC_URL'] = 'http://' + Site.objects.get_current().domain + settings.STATIC_URL
        if not match_full_url.match(settings.MEDIA_URL):
            context['MEDIA_URL'] = 'http://' + Site.objects.get_current().domain + settings.MEDIA_URL

        return context


class PdfTemplateView(PDFTemplateView): #TODO: Remove this in v1.0
    def as_view(cls, **initkwargs):
        warning = '''PdfTemplateView is deprecated in favour of PDFTemplateView. It will be removed in version 1.'''
        raise PendingDeprecationWarning(warning)
        return super(PdfTemplateView, cls).as_view(**initkwargs)