from reportlab.lib.pagesizes import A4 #, letter...etc
from reportlab.pdfgen import canvas
from reportlab.pdfbase import pdfmetrics
from reportlab.pdfbase.ttfonts import TTFont


'''
    Need to check for sender and receiver sections
    Other alternatives can be pdf-gen, pdf-generator, pdf-play, pdf34, abdul-987-pdf
'''


class PyqcrmPDF:
    __pyq_doc = None
    __pyq_pdf = None
    __pyq_usable_width = 0
    __pyq_usable_height = 0
    __pyq_lr_margin = 20
    __pyq_tb_margin = 25
    __line = 0
    __line_height = 14
    __doc_title = "PYQCRM PDF Document"
    __doc_author = "The PYQCRM Team"
    __doc_subject = "PYQCRM Document"

    def __init__(self, doc_title, doc_subject, pdf_file):
        self.__pyq_usable_width = A4[0]  - self.__pyq_lr_margin - self.__pyq_lr_margin
        self.__pyq_usable_height = A4[1] - self.__pyq_tb_margin - self.__pyq_tb_margin
        self.__line = self.__pyq_usable_height + self.__pyq_tb_margin
        self.__pyq_pdf = canvas.Canvas(pdf_file, pagesize=A4)
        self.__pyq_pdf.setAuthor(self.__doc_author)
        self.__pyq_pdf.setTitle(doc_title if doc_title else self.__doc_title)
        self.__pyq_pdf.setSubject(doc_subject if doc_subject else self.__doc_subject)
        self.__pyq_doc = self.__pyq_pdf.beginText(self.__pyq_lr_margin, self.__line)
        self.__pyq_doc.setFont("Helvetica", 12)

    def addLine(self, line):
            #self.__pyq_pdf.drawString(self.__pyq_lr_margin, self.__line, line) : Need to check if it does the trick!
            # print(f"Line No.: {self.__line}")
            # print(f"Line: {line}")
            if self.__pyq_doc.getY() < self.__pyq_tb_margin:
                # print("creating a new page...")
                self.__pyq_pdf.drawText(self.__pyq_doc)
                self.__pyq_pdf.showPage()
                self.__line = self.__pyq_usable_height + self.__pyq_tb_margin
                # print(f"Line No.: {self.__line}")
                self.__pyq_doc = self.__pyq_pdf.beginText(self.__pyq_lr_margin, self.__line)
                self.__pyq_doc.setFont("Helvetica", 12)

            if pdfmetrics.stringWidth(line, "Helvetica", 12) > self.__pyq_usable_width:
                # print(f"Line width: {pdfmetrics.stringWidth(line, 'Helvetica', 12)}, Available width: {self.__pyq_usable_width}")
                words = line.split(' ')
                line = ''
                for word in words:
                    # print(f"Line: {line}")
                    if self.__pyq_doc.getY() < self.__pyq_tb_margin:
                        # print("creating a new page...")
                        self.__pyq_pdf.drawText(self.__pyq_doc)
                        self.__pyq_pdf.showPage()
                        self.__line = self.__pyq_usable_height + self.__pyq_tb_margin
                        # print(f"Line No.: {self.__line}")
                        self.__pyq_doc = self.__pyq_pdf.beginText(self.__pyq_lr_margin, self.__line)
                        self.__pyq_doc.setFont("Helvetica", 12)

                    if pdfmetrics.stringWidth(line + word + ' ', "Helvetica", 12) <= self.__pyq_usable_width:
                        line = line + word + ' '
                    else:
                        self.__pyq_doc.textLine(line)
                        line = word + ' '
                        # print(f"Last line: {line}")

            if line:
                # print(f"Available line: {line}")
                self.__pyq_doc.textLine(line)

            self.__line = self.__line + self.__line_height

    def saveDoc(self):
            self.__pyq_pdf.drawText(self.__pyq_doc)
            self.__pyq_pdf.showPage()
            self.__pyq_pdf.save()
