import config
import reportlab.pdfbase.pdfdoc as pdfdoc
from reportlab.pdfbase.pdfdoc import _getTimeStamp, md5, bytestr, DummyDoc, PDFString, pdfdocEnc
import reportlab.pdfgen.canvas as canvas
from reportlab.pdfgen.canvas import Canvas

class PDFInfo(pdfdoc.PDFInfo):
    creator = config.APP_NAME
    producer = config.APP_NAME
    title = "SURVEY TITLE"
    author = "SURVEY AUTHOR"
    subject = "SURVEY SUBJECT"
pdfdoc.PDFInfo = PDFInfo

class PDFFile(pdfdoc.PDFFile):
    ### just accumulates strings: keeps track of current offset
    def __init__(self,pdfVersion=pdfdoc.PDF_VERSION_DEFAULT):
        self.strings = []
        self.write = self.strings.append
        self.offset = 0
        ### chapter 5
        # Following Ken Lunde's advice and the PDF spec, this includes
        # some high-order bytes.  I chose the characters for Tokyo
        # in Shift-JIS encoding, as these cannot be mistaken for
        # any other encoding, and we'll be able to tell if something
        # has run our PDF files through a dodgy Unicode conversion.
        self.add((pdfdocEnc("%%PDF-%s.%s" % pdfVersion) +
            b'\r\n%\223\214\213\236 Survey PDF\r\n'
            ))
pdfdoc.PDFFile = PDFFile

class PDFDocument(pdfdoc.PDFDocument):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        sig = self.signature = md5()
        sig.update(b"a survey document")
        if not self.invariant:
            cat = _getTimeStamp()
        else:
            cat = 946684800.0
        cat = ascii(cat)
        sig.update(bytestr(cat)) # initialize with timestamp digest
        #self.info = PDFInfo()
        #self.info.invariant = self.invariant

    def ID(self):
        "A unique fingerprint for the file (unless in invariant mode)"
        if self._ID:
            return self._ID
        digest = self.signature.digest()
        doc = DummyDoc()
        IDs = PDFString(digest,enc='raw').format(doc)
        self._ID = (b'\r\n % PDF Survey -- digest\r\n ['
                        +IDs+b' '+IDs+b']\r\n')
        return self._ID
canvas.pdfdoc.PDFDocument = PDFDocument
