import sys
import json
import base64
from reportlab.lib.units import cm
import io
from reportlab.lib.colors import Color, black
from reportlab.lib.pagesizes import letter
from reportlab.lib.styles import *
from reportlab.lib.enums import TA_CENTER
from reportlab.pdfgen import canvas
from reportlab.platypus import *
from reportlab.pdfbase import pdfmetrics
import re
from reportlab.pdfbase.ttfonts import TTFont
pdfmetrics.registerFont(TTFont('dejaVu-sans', './src/python/utils/DejaVuSansCondensed.ttf'))
pdfmetrics.registerFont(TTFont('dejaVu-sans-bold', './src/python/utils/DejaVuSansCondensed-Bold.ttf'))

elements = []
data = json.loads(sys.stdin.buffer.read().decode('utf-8'))
ancho_pagina, alto_pagina = letter
altura_frame_central = alto_pagina * 0.95
styles = getSampleStyleSheet()
styles.add(ParagraphStyle(name='boldCabecera', fontName='dejaVu-sans-bold', fontSize=9))
styles.add(ParagraphStyle(name='normalCabecera', fontName='dejaVu-sans', fontSize=9))
styles.add(ParagraphStyle(name='boldTabla', fontName='dejaVu-sans-bold', fontSize=8.5))
styles.add(ParagraphStyle(name='normalTabla', fontName='dejaVu-sans', fontSize=8.5))
styles.add(ParagraphStyle(name='columnsCenter', fontName='dejaVu-sans', fontSize=8.5, alignment=TA_CENTER))

class FooterCanvas(canvas.Canvas):

    def __init__(self, *args, **kwargs):
        canvas.Canvas.__init__(self, *args, **kwargs)
        self.pages = []
        self.width, self.height = letter
        self.blue = Color((0/255), (140/255), (179/255), 1)
        self.grey = Color((105/255), (105/255), (105/255), 1)

    def showPage(self):
        self.pages.append(dict(self.__dict__))
        self._startPage()

    def save(self):
        page_count = len(self.pages)
        for page in self.pages:
            self.__dict__.update(page)
            if (self._pageNumber > 0):
                self.draw_canvas(page_count)
            canvas.Canvas.showPage(self)
        canvas.Canvas.save(self)

    def draw_canvas(self, page_count):
        page = "%s/%s" % (self._pageNumber, page_count)
        self.saveState()
        self.setFont('dejaVu-sans', 6)
        self.drawString(60, 40, page)
        self.drawImage('./src/python/utils/CE_ISO.png', 100, 33, width=50, height=23)
        self.drawImage('./src/python/utils/Logo.png',50, alto_pagina - 10, width=150, height=14)
        self.setFillColor(self.grey)
        self.drawRightString(self.width - 60, 43, 'P.I. Los Santos, Reg. 59.279, Pa. 10 | Aptdo. Correos 410 • 14900 Lucena • Córdoba • España')
        self.drawRightString(self.width - 60, 36, 'Tel: +34 957 50 92 93')
        self.drawRightString(self.width - 60, 29, 'www.intarcon.es')
        self.setFont('dejaVu-sans', 6.5)
        self.setFillColor(self.blue)
        self.drawRightString(self.width - 60, 50, 'INDUSTRIAS DE TECNOLOGIAS APLICADAS DE REFRIGERACION Y CONSERVACION S.L.')
        self.restoreState()


def test():
    buffer = io.BytesIO()
    doc = BaseDocTemplate(buffer, rightMargin=80,leftMargin=80, topMargin=80, bottomMargin=80)
    espacio_superior = 15 
    espacio_inferior = 30  
    nueva_altura_frame = altura_frame_central - espacio_superior - espacio_inferior
    frame_central = Frame(0, alto_pagina - nueva_altura_frame - espacio_superior, ancho_pagina-80, nueva_altura_frame ,leftPadding=0, rightPadding=0, topPadding=0, bottomPadding=0)
    plantilla_pagina = PageTemplate(frames=[frame_central])

    agregar_contenido_central()

    doc.addPageTemplates([plantilla_pagina])
    doc.multiBuild(elements, canvasmaker=FooterCanvas)
    pdf_bytes = buffer.getvalue()
    pdf_base64 = base64.b64encode(pdf_bytes).decode('utf-8')

    return pdf_base64


def agregar_contenido_central():
    elements.append(Spacer(1, 10))
    infoPedStyle = TableStyle([
        ('TOPPADDING', (0, 0), (-1, -1), 0),
        ('BOTTOMPADDING', (0, 0), (-1, -1), 0),
        ('LEFTPADDING', (0, 0), (-1, -1), 50),
        ('RIGHTPADDING', (0, 0), (-1, -1), 0),
        ('VALIGN', (0, 0), (-1, -1), 'TOP')
    ])
    quoteStyle = TableStyle([
        ('TOPPADDING', (0, 0), (-1, -1), 0),
        ('BOTTOMPADDING', (0, 0), (-1, -1), 0),
        ('LEFTPADDING', (0, 0), (-1, -1), 0),
        ('RIGHTPADDING', (0, 0), (-1, -1), 0),
    ])
    pedNumberStyle = TableStyle([
        ('TOPPADDING', (0, 0), (-1, -1), 0),
        ('BOTTOMPADDING', (0, 0), (-1, -1), 0),
        ('LEFTPADDING', (0, 0), (-1, -1), 83),
        ('RIGHTPADDING', (0, 0), (-1, -1), 0),
    ])

    tableQuote = Table([
        [Paragraph(str(data['orderData'].get('Quote_ID') or ''), styles['normalCabecera'])],
        [Paragraph(str(data['orderData'].get('Account_Name') or ''), styles['boldCabecera'])],
        [Paragraph(str(data['orderData'].get('calle') or ''),styles['normalCabecera'])],
        [Paragraph(str(data['orderData'].get('codigo_postal') or ''),styles['normalCabecera'])],
        [Paragraph(str(data['orderData']['ciudad'] if data['orderData']['ciudad'] is not None else data['orderData'].get('estado') or ''), styles['normalCabecera'])],
        [Paragraph(str(data['orderData'].get('pais') or ''), styles['normalCabecera'])],
    ])
    tableQuote.setStyle(quoteStyle)

    tablePedNumber = Table([
        [Paragraph("Num. pedido: " + str(data['orderData']['nPedido']), styles['boldCabecera'])],
        [Paragraph('Fecha de expidición: '+str(data['orderData'].get('Expiration_Date') or ''), styles['normalCabecera'])],
        [Paragraph('Nombre Oportunidad: '+str(data['orderData'].get('Potential_name') or '') , styles['normalCabecera'])],
        [Paragraph('Sector de Mercado: '+str(data['orderData'].get('Sector_Mercado') or ''), styles['normalCabecera'])],
    ])

    tablePedNumber.setStyle(pedNumberStyle)
    dataInfoPed = [[tableQuote, tablePedNumber]]
    tableInfoPed = Table(dataInfoPed)
    tableInfoPed.setStyle(infoPedStyle)
    elements.append(tableInfoPed)
    elements.append(Spacer(1, 10))

    salesData = [
        [Paragraph('Su ref.: '+str(data['orderData'].get('s_ref') or ''), styles['boldCabecera'])],
        [Paragraph('Ref. oferta: '+str(data['orderData'].get('Ref_oferta') or ''), styles['normalCabecera'])],
        [Paragraph('Descripción: '+str(data['orderData'].get('Sales_description') or ''), styles['normalCabecera'])],
    ]
    
    salesTableStyle = TableStyle([
        ('TOPPADDING', (0, 0), (-1, -1), 0),
        ('BOTTOMPADDING', (0, 0), (-1, -1), 0),
        ('LEFTPADDING', (0, 0), (-1, -1), 50),
        ('RIGHTPADDING', (0, 0), (-1, -1), 0),
    ])

    tableSalesOrder = Table(salesData)
    tableSalesOrder.setStyle(salesTableStyle)
    elements.append(tableSalesOrder)
    elements.append(Spacer(1, 10))

    styleTableProducts = TableStyle([
        ('FONTNAME', (0,0), (2, 0), 'dejaVu-sans-bold'),
        ('FONTSIZE', (0,0), (2, 0), 7),
        ('ALIGN', (0,0), (0, 0), 'CENTER'),
        ('ALIGN', (-1, 0), (-1, 0), 'CENTER'),
        ('TOPPADDING', (0, 0), (-1, -1), 2),
        ('BOTTOMPADDING', (0, 0), (-1, -1), 2),
        ('RIGHTPADDING', (0, 0), (-1, -1), 0)
    ])

    dataTableProducts = [['Pos', 'Descripción','Cant/Uds']]
    for product in data['products']:
        dataTableProducts.append([Paragraph(str(product['sequence_no']), styles['columnsCenter']), Paragraph(product['producto_Serie'] +' '+product['producto_Nombre'], styles["boldTabla"]), Paragraph(str(float(product['quantity'])), styles['columnsCenter'])])
        for subproduct in data['subproducts']:
            if subproduct['sequence_no'] == product['sequence_no']:
                dataTableProducts.append(['', Paragraph('- '+subproduct['subproduc'], styles['normalTabla']), ''])
        dataTableProducts = addLineBreak(dataTableProducts, product['description'], styles['normalTabla']) if product['description'] != '' else dataTableProducts
        dataTableProducts = addLineBreak(dataTableProducts, product['comment'], styles['normalTabla']) if product['comment'] != '' else dataTableProducts
        dataTableProducts.append(['',HRFlowable(color=black, width="100%", thickness=0),''])

    tableProducts = Table(dataTableProducts, [1 * cm, 14 * cm, 1 * cm], repeatRows=1)
    tableProducts.setStyle(styleTableProducts)
    elements.append(tableProducts)


def addLineBreak(dataTableProduct, text, style):
    text = re.sub(r'<\/?b>', '', text)
    lines = re.split(r'[\n\r]+', text)
    for line in lines:
        dataTableProduct.append(['',Paragraph(line, style),''])

    return dataTableProduct


print(test())
