import time
import serial
import os
import textwrap
import subprocess

def printLabel(dataToPrint):
    # Configuration for RS232
    printer_name = 'SN_420B' # '/dev/tty.usbserial-1110'   

    brand = dataToPrint['brand']
    plu = dataToPrint['plu']
    name = dataToPrint['name']
    description = dataToPrint['description']
    ingredients = dataToPrint['ingredients']
    net_weight = dataToPrint['net_weight']
    production_date = dataToPrint['production_date']
    best_before_date = dataToPrint['best_before_date']
    passed_from_metal_detector = dataToPrint['passed_from_metal_detector']
    lot_number = dataToPrint['lot_number']
    barcode = dataToPrint['barcode']
    cert_1 = dataToPrint['cert_1']
    cert_2 = dataToPrint['cert_2']
    logo = dataToPrint['logo']
    address = dataToPrint['address']
    upc_barcode = dataToPrint['upc_barcode']

    last_9 = barcode[-9:]

    # ZPL width boundary
    max_line_length = 65  # approx. chars per line
    ingredients_lines = textwrap.wrap(f"Ingredients: {ingredients}", max_line_length)

    ingredients_zpl = ""
    y_start = 560
    x = 300
    line_spacing = 20

    for i, line in enumerate(ingredients_lines):
        y = y_start - i * line_spacing
        ingredients_zpl += f"^CF0,22\n^FO{y},{x}^FD{line}^FS\n"

    print_data = f"""
    ^XA

    {logo}

    ^FWR
    ^CF0,50
    ^FO650,300^FD{brand}^FS

    ^CF0,40
    ^FO620,300^FD{name}^FS

    ^CF0,30
    ^FO590,300^FD{description}^FS

    {ingredients_zpl}

    {cert_1}
    {cert_2}

    ^CF0,55
    ^FO390,440^FDNET WT: {net_weight}^FS

    ^FWR
    ^CF0,60
    ^FO505,10^FD{plu}^FS

    ^FWR
    ^CF0,25
    ^FO355,10^FDProduction date^FS

    ^FWR
    ^CF0,25
    ^FO335,10^FDDate de production^FS

    ^FWR
    ^CF0,25
    ^FO315,10^FD{production_date}^FS

    ^FWR
    ^CF0,25
    ^FO355,240^FDBest before^FS

    ^FWR
    ^CF0,25
    ^FO335,240^FDMeilleure avant^FS

    ^FWR
    ^CF0,25
    ^FO315,240^FD{best_before_date}^FS

    ^FWR
    ^CF0,25
    ^FO355,440^FDPASSED FROM METAL DETECTOR^FS

    ^FWR
    ^CF0,25
    ^FO335,440^FDKEEP REFRIGERATED^FS

    ^FWR
    ^CF0,25
    ^FO315,440^FDLot #: {lot_number}^FS

    ^FO195, 10 ^BY 2 ^BC , 110, , , , A ^FD {barcode} ^FS

    ^CF0,20
    ^FO130,40^FD{address}^FS

    ^CF0,20
    ^FO110,40^FDCreated by: QaTrace.com^FS
    
    ^FO350,900
    ^BY1.5,2,80
    ^BCN,,Y,N
    ^FD{upc_barcode}^FS

    ^XZ
    """
    
    try:
        with open("/tmp/label.zpl", "w") as f:
            f.write(print_data)

        subprocess.run(["lp", "-d", printer_name, "-o", "raw", "/tmp/label.zpl"])
        print("Data sent to the printer successfully.")

    except serial.SerialException as e:
        print(f"Error communicating with the printer: {e}")


dataToPrint = {
    "brand": "MRAKOVIC",
    "address": "16 Jutland Rd, Toronto, Ontario, M8Z 2G9",
    "plu": "12345",
    "name": "Chevapi",
    "description": "BEEF CHEVAPI (2X500X10PC)",
    "ingredients": """Beef Meat, Water, Salt, Dextrose, Flavoring (soy, corn), Sodium phosphate,Hydrolyzed vegetable protein (corn), Caramel liquid (Sulphites).ALLERGEN: SOY, SULPHITIES""",
    "net_weight": "10.00kg",
    "production_date": "2025-06-29",
    "best_before_date": "2025-12-29",
    "passed_from_metal_detector": True,
    "lot_number": "A102B3",
    "barcode": "0100000000012426112506263102001000215005371143",
    "cert_1": "^FO400,15^GFA,1723,2850,19,:Z64:eJyllj1sHFUQx+ftrnN7DtLt2kgpvb47RDojJbTcnn0SNhShoETYoqWiR7q92JKd6s6yREosQUUBVBSpzs6Bky6hgCbFOSZYioS1JibZOJs3zLz39uPc5iz5Vr+beW/m/+bNLMAbft7/9OcLxAGwoknUBuF6F8yaW8HUBJhp0r9BOGn1E34PZU+rfRlR9sqeVbeLiGcwLIVgEcE0CAoUXGGEIzcnAroKxTcLq1uKYFrNybStEUIemXvFoOFubtYy6N9iQ0MwyeIXUxlKL2XpZKsjiszxdo52I7NhLUcjE4XVytHYZBl0c/TSbNnJCSZXNeoVSJoNZ0vIyPNhgVDLIyoltK1VniuhoY61jMZ6LRPWCyWPCr9qgj/GZxRYUA7+GCuZYsIsczchlA4YrWQhRbezWPPjsWoXkbfMunUY3TDpWbBKXypUk0/qqpg3GPWNVOEKo2Epn0Sop/sldOqqtThJa9Uk/EGTMzssFcQQe2wf05bCoI0nw5qRwjVZb0d/NXgX8vMMEoO1iNEaOWokbWvNQS2YY4Kfj77w6ft1Xm8vkqnB2hL/5CkFz7v4JO7tH/KOkhx9TOIaxov+4UghslrCUwooBvgq4ghZQxvHexU89TqWp4ImqwYeHdzFMwt22yoclxU86h9h7PongPiKjgBgBw8OjjCJlv6uIn6H2ORSYqtkXlwTeF5RSpPjwQEmjj3bwN2aQeO1Cjn6O/YZK7zB9yCmoku89h1XKRyx1UsqunNh020JKLIBiBpluoppp/ooqDuEflOH/SuLKagVhV0uYKEvUOqFHW9L0PL7AAb1LiMIj9A9gAWNHCEXA6eirKgkXndJucBynbCnioIc0xamENm6ukeqJGQL5Yxje9szFNhQOco5lKH/uUXH1cffdeHM0aUTMnLbnq3XevrDpnSq9lOvTYryjt9SSdnSiwIgx8U2PmCrMTTkH7AxCmfq1Az2ea1D30bZFM/diANXO8oTCg38XwC2et1sRz7R9Ua9CV4WPecYilmAOuU4ysWx3tlxb7J4+9l9ST0hA6+T6yUJRetSqOq+pxxJicTxlzeqfksJvaCUSAOyCUAdBzcOUiLpBV8H0Gmpc+QdCTlTsvKQEqZzpDL570s6Xk/0ZyXkNUFll8BOXeCZrpxNFgcTS6y3kTvF21xyj+dtjAe2TZfimbKy8Z8fuQBWvvFUHnlPiDsCx1lFf6yvMRjEdd/WVtYyWCydXM660GkMkRKFL4yv0HHSOGlyE+E2Om/uY++52il9r7ii9jWff025WDRCf1Y9JrvFdbd3nGp2tw3q3Qk2GYVFN7mP6uk0LLrJ4aMqhxpzPzboSN0NHEdFi6bw+elxVOpylkPK4x73LzNf0uWiy72rkYSA0c3SBJDC6RsE6yajpjpStzxNovpCNmLaBq0/4FrQg8igP2VF9yp6ITDomP4wGUzOjlfZoHBbGeK01DhxTZJaD4WsGyVkRlOthG7p0bRZQmbMFQMZpZnS2yXU1CgsUJK9UbQKpIMHr0DZkHb6OdoPjWMR2EBHWn4tsIyRyLdMHYMgyjdsZmgm0+KweGvK1h8FGXEbBhUvTZYZt6mf+wmjdXwpRxDqxfauFihQRSDLr2nTSoy4GhbI8rh8YBFKnyhawF3nrTK6zv/an5SRQ6rMuFEZwQZ4YXOCwPRHi1PDSQQP/c/gTT//A+X9S90=:527C^FS",
    "cert_2": "^FO401,129^GFA,2140,2850,19,:Z64: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:2C56^FS",
    "logo": "^FO510,10^GFA,4043,7000,28,:Z64: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:276D^FS",
    "upc_barcode": "628774423063"
}


printLabel(dataToPrint)
