from django.contrib import admin
from django.template.response import TemplateResponse
from django.urls import path
from django.shortcuts import render
from django.conf.urls import url

from hardcopy import bytestring_to_pdf
from django.core.files.temp import NamedTemporaryFile
from django.http import FileResponse
from django.template.loader import render_to_string

from uncloud_pay.models import *

class BillRecordInline(admin.TabularInline):
    model = BillRecord

class RecurringPeriodInline(admin.TabularInline):
    model = ProductToRecurringPeriod

class ProductAdmin(admin.ModelAdmin):
    inlines = [ RecurringPeriodInline ]

class BillAdmin(admin.ModelAdmin):
    inlines = [ BillRecordInline ]

    def get_urls(self):
        """
        Create URLs for PDF view
        """

        info = "%s_%s" % (self.model._meta.app_label, self.model._meta.model_name)
        pat = lambda regex, fn: url(regex, self.admin_site.admin_view(fn), name='%s_%s' % (info, fn.__name__))

        url_patterns = [
            pat(r'^([0-9]+)/as_pdf/$', self.as_pdf),
            pat(r'^([0-9]+)/as_html/$', self.as_html),
        ] + super().get_urls()

        return url_patterns

    def as_pdf(self, request, object_id):
        bill = self.get_object(request, object_id=object_id)
        print(bill)

        if bill is None:
            raise self._get_404_exception(object_id)

        output_file = NamedTemporaryFile()
        bill_html = render_to_string(
            "uncloud_pay/bill.html.j2",
            {
                'bill': bill,
                'bill_records': bill.bill_records.all()
            }
        )

        bytestring_to_pdf(bill_html.encode('utf-8'), output_file)
        response = FileResponse(output_file, content_type="application/pdf")
        response['Content-Disposition'] = f'filename="bill_{bill}.pdf"'

        return response

    def as_html(self, request, object_id):
        bill = self.get_object(request, object_id=object_id)

        if bill is None:
            raise self._get_404_exception(object_id)

        return render(request, 'uncloud_pay/bill.html.j2',
                      {'bill': bill,
                       'bill_records': bill.bill_records.all()
                      })


        bill_html = render_to_string("bill.html.j2", {'bill': bill,
                                                      'bill_records': bill.bill_records.all()
        })

        bytestring_to_pdf(bill_html.encode('utf-8'), output_file)
        response = FileResponse(output_file, content_type="application/pdf")

        response['Content-Disposition'] = f'filename="bill_{bill}.pdf"'

        return HttpResponse(template.render(context, request))
        return response


admin.site.register(Bill, BillAdmin)
admin.site.register(Product, ProductAdmin)

for m in [
        BillingAddress,
        Order,
        BillRecord,
        Payment,
        ProductToRecurringPeriod,
        RecurringPeriod,
        StripeCreditCard,
        StripeCustomer,
        PricingPlan,
        VATRate
]:
    admin.site.register(m)
