# -*- coding: utf-8 -*-
# badges/views.py

from django.template import TemplateDoesNotExist
from django.conf import settings
from os import path, remove, system, rmdir
import subprocess
from cStringIO import StringIO

from reportlab.pdfbase import pdfmetrics
from reportlab.pdfbase.ttfonts import TTFont
from dabo.dReportWriter import dReportWriter
import PIL, Image
import tempfile

from django.contrib.auth.models import User
from django.http import HttpResponse

from django import newforms as forms

GHOSTSCRIPT_CMD = getattr(settings, 'GHOSTSCRIPT_CMD', 'gs')

def get_templete_abspath(template_name):
    from django.template.loaders.app_directories import get_template_sources
    for filename in get_template_sources(template_name):
        filename = path.abspath(filename)
        if path.exists(filename): return filename
    raise TemplateDoesNotExist, template_name

class badge_values(forms.Form):
    bod = forms.BooleanField(required=False)
    full_name=forms.CharField(required=False)
    attendeeID = forms.IntegerField(required=False)
    badge_line1=forms.CharField(required=False)
    badge_line2=forms.CharField(required=False)
    key_note = forms.BooleanField(required=False)
    speaker = forms.BooleanField(required=False)
    vendor = forms.BooleanField(required=False)
    session_chair = forms.BooleanField(required=False)
    sponsor = forms.BooleanField(required=False)
    shirt_size = forms.CharField(required=False)
    shirt_type = forms.CharField(required=False)
    email = forms.CharField(required=False)

def badge(request):

    ds = getds(request)
    pdf = mkpdf(ds)

    # Create the HttpResponse object with the appropriate PDF headers.
    response = HttpResponse(mimetype='application/pdf')
    response['Content-Disposition'] = 'filename=badge.pdf'
    response.write(pdf)
    return response

def preview(request):

    ds = getds(request)
    png = doug_sample(ds)

    response = HttpResponse(mimetype='image/png')
    response.write(png)
    return response

def getds(request):
    """
    get the badge data out of the request
    return it in a format that is ready for 'rendering'
    """
    ds=badge_values(request.GET)
    if ds.is_valid():
        bsd = ds.cleaned_data
        # print bsd
    else:
        # this should cause a 500 server error.
        # not sure what else to do here.
        print ds.errors

    return bsd

def sample(ds):

    """make a sample badge image based on real data"""

    ds['attendeeID']='SAMPLE'
    pdf = mkpdf(ds)

    tempDir = tempfile.mkdtemp( prefix = "badgePreview_" )
    pdfname = path.join( tempDir, 'badge.pdf' )
    imgname = path.join( tempDir, 'badge.png' )

    open(pdfname,'wb').write(pdf)

    # convert pdf to some image format (uses ext to determine type)
    # system('convert %s %s' % (pdfname, imgname))
    # gs -sDEVICE=png16m -sOutputFile=x.png -dBATCH -dNOPAUSE badge.pdf
    gs_command = [GHOSTSCRIPT_CMD,
        '-q',
        '-sDEVICE=png16m',
        '-dBATCH', '-dNOPAUSE',
        '-sOutputFile=%s'%imgname,
        pdfname ]
    try:
        subprocess.call(' '.join(gs_command), shell=True)
    except OSError, e:
        ## just to be extra extra safe... process is already gone...
        if e.errno != 10: raise

    # crop the badge (pdf may be 8x11 page)
    # and write to a string that can be reutnred
    buffer = StringIO()
    Image.open(imgname).crop([0,0,300,235]).save(buffer, 'png')
    img = buffer.getvalue()

    # clean up
    buffer.close()
    remove(pdfname)
    remove(imgname)
    rmdir(tempDir)

    return img

def doug_sample(ds):

    """make a sample badge image based on real data"""

    ds['attendeeID']='SAMPLE'
    pdf = mkpdf(ds)

    # convert pdf to some image format
    gs_command = [GHOSTSCRIPT_CMD,
        '-q',
        '-sDEVICE=png16m',
        '-dBATCH', '-dNOPAUSE',
        '-sOutputFile=-',
        '-' ]
    gs_run = subprocess.Popen(gs_command, shell=False, stdin=subprocess.PIPE,
                              stdout=subprocess.PIPE, close_fds=True,
                              bufsize=1<<12)
    real_wait = gs_run.wait
    def hack_wait():
        try: return real_wait()
        except OSError, e:
            if e.errno != 10: raise
        return 0
    gs_run.wait = hack_wait
    (stdout, stderr) = gs_run.communicate(pdf)

    # crop the badge (pdf may be 8x11 page)
    # and write to a string that can be reutnred
    buffin = StringIO(stdout)
    buffout = StringIO()
    Image.open(buffin).crop([0,0,286,225]).save(buffout, 'png')
    img = buffout.getvalue()
    return img

def mkpdf(ds, sample=False):
    """
    Return a pdf made from the passed dataset.
    """

    # RED_FLAG: we should make the rfxml files real templates
    #           and use the template system to find the images
    #           it uses, with abspaths. That way other clients
    #           can override the badges.
    # NOTE: in fastcgi+flup in restricted mode there is NO __file__
    #       so we can not use that for clients like PyConUK
    xmlfile  = get_templete_abspath('badges/badge2.rfxml')
    fontfile = get_templete_abspath('badges/fonts/FreeSans.ttf')\

    # buffer to create pdf in
    buffer = StringIO()

    # nonstandard font.  (not sure what standard is.)
    pdfmetrics.registerFont(TTFont("FreeSans", fontfile))

    # generate the pdf in the buffer, using the layout and data
    rw = dReportWriter(OutputFile=buffer, ReportFormFile=xmlfile, Cursor=[ds])
    rw.write()

    # get the pdf out of the buffer
    pdf = buffer.getvalue()
    buffer.close()

    return pdf

def test(request):

    ds={'full_name':'Ivan Krsti\xc4\x87', 'attendeeID':1234,
    'badge_line1':'laptop.org', 'badge_line2':'Sprint Leader: OLPC',
                   'key_note':True, 'speaker':True, 'vendor':True,
                   'session_chair':True, 'sponsor':True,
                    'shirt_size':'L', 'shirt_back':True }

    # import urllib
    # print urllib.urlencode(ds)
    # http://0.0.0.0:8000/2008/badges/sample/?sponsor=True&badge_line1=laptop.org&shirt_size=L&badge_line2=Sprint+Leader%3A+OLPC&attendeeID=1234&shirt_back=True&speaker=True&full_name=Ivan+Krsti%C4%87&vendor=True&key_note=True&session_chair=True

    img = sample(ds)

    response = HttpResponse(mimetype='image/png')
    response.write(img)
    return response

# eof: badges/views.py
