from io import BytesIO
from patchedpdf import Canvas

from reportlab.graphics import barcode
from reportlab.graphics import renderPDF

class SurveyException(Exception):
    pass

class Survey(object):
    def __init__(self, id):
        self.header = None
        self.footer = None
        self.paper = None

        self._canvas = None

        self.id = id
        self._signature = None
        self._barcode = None

        self._initializeValues()

    def _initializeValues(self):
        #TODO: Calculate values/read from database
        self.surveyname = None
        self.questions = []

        self.version = 0
        self.pagesize = 11
        self.headersize = 1
        self.footersize = 1

    def signature(self):
        if not self._signature:
            #TODO: Make this a crypto signature
            self._signature = "%d.%d" % (self.id, self.version)
        return self._signature

    def barcode(self):
        if not self._barcode:
            self._barcode = barcode.createBarcodeDrawing("QR", value=self.signature())
        return self._barcode

    def renderPDF(self):
        canvas = Canvas(BytesIO())

        #TODO: Render header
        self.addHeader(canvas)
        for question in self.questions:
            if question.height + canvas.currentheight > survey.pagesize + survey.footersize:
                self.addfooter(canvas)
                canvas.nextpage()
                self.addheader(canvas)
                question.renderPDF(canvas)
        self.addFooter(canvas)

        return canvas.getpdfdata()

    def addHeader(self, canvas):
        renderPDF.draw(self.barcode(), canvas, 0, 0)

    def addFooter(self, canvas):
        pass

def getPDF(id):
    if int(id) == 0:
        #Demo Survey
        survey = Survey(0)
        return survey.renderPDF()
    else:
        raise SurveyException("Invalid surveyid")
