import os
import shutil
import barcode
from barcode import EAN13, ITF
from barcode.writer import ImageWriter, SVGWriter
from PIL import Image, ImageDraw, ImageFont
from fpdf import FPDF

# Paths
BASE_DIR = r"C:\Users\kaue.pereira\.gemini\antigravity-ide\scratch\codigos_barras"
ARTIFACTS_DIR = r"C:\Users\kaue.pereira\.gemini\antigravity-ide\brain\fb9fb70f-18a5-4fb2-9831-69d08203bba9"

PNG_DIR = os.path.join(BASE_DIR, "png")
SVG_DIR = os.path.join(BASE_DIR, "svg")
LABELS_DIR = os.path.join(BASE_DIR, "etiquetas")
ARTIFACTS_IMG_DIR = os.path.join(ARTIFACTS_DIR, "barcodes")

for d in [PNG_DIR, SVG_DIR, LABELS_DIR, ARTIFACTS_IMG_DIR]:
    os.makedirs(d, exist_ok=True)

# Product dataset
PRODUCTS = [
    {
        "sku": "51368",
        "name": "AN HIGH PROTEIN SHAKE FUDGE BROWNIE 8X330ML",
        "flavor": "Fudge Brownie",
        "ean": "5056555201275",
        "dun": "5056555202081",
        "dun_itf14": "05056555202081",
        "pack_dim": "12cm (L) x 24cm (C) x 17cm (A)",
        "unit_dim": "6cm (L) x 17cm (A)",
        "pack_units": "8 x 330ml",
        "color_accent": "#5D3A1A",
    },
    {
        "sku": "51367",
        "name": "AN HIGH PROTEIN SHAKE STRAWBERRIES CREAM 8X330ML",
        "flavor": "Strawberries & Cream",
        "ean": "5056555201268",
        "dun": "5056555202074",
        "dun_itf14": "05056555202074",
        "pack_dim": "12cm (L) x 24cm (C) x 17cm (A)",
        "unit_dim": "6cm (L) x 17cm (A)",
        "pack_units": "8 x 330ml",
        "color_accent": "#C43B60",
    },
    {
        "sku": "51366",
        "name": "AN HIGH PROTEIN SHAKE VANILLA ICE CREAM 8X330ML",
        "flavor": "Vanilla Ice Cream",
        "ean": "5056555201282",
        "dun": "5056555202098",
        "dun_itf14": "05056555202098",
        "pack_dim": "12cm (L) x 24cm (C) x 17cm (A)",
        "unit_dim": "6cm (L) x 17cm (A)",
        "pack_units": "8 x 330ml",
        "color_accent": "#D4A340",
    }
]

# Generate raw PNG and SVG barcodes
writer_opts_png = {
    "module_width": 0.4,
    "module_height": 18.0,
    "font_size": 11,
    "text_distance": 5.0,
    "quiet_zone": 5.0,
    "write_text": True,
}

writer_opts_itf_png = {
    "module_width": 0.4,
    "module_height": 18.0,
    "font_size": 11,
    "text_distance": 5.0,
    "quiet_zone": 6.0,
    "write_text": True,
}

writer_opts_svg = {
    "module_width": 0.4,
    "module_height": 18.0,
    "font_size": 10,
    "text_distance": 5.0,
    "quiet_zone": 5.0,
    "write_text": True,
}

print("Generating barcodes...")

for p in PRODUCTS:
    sku = p["sku"]
    # 1. EAN-13 (Unit) PNG & SVG
    ean_code = p["ean"]
    ean_obj_png = EAN13(ean_code, writer=ImageWriter())
    ean_png_path = os.path.join(PNG_DIR, f"{sku}_EAN13_{ean_code}")
    ean_obj_png.save(ean_png_path, options=writer_opts_png)

    ean_obj_svg = EAN13(ean_code, writer=SVGWriter())
    ean_svg_path = os.path.join(SVG_DIR, f"{sku}_EAN13_{ean_code}")
    ean_obj_svg.save(ean_svg_path, options=writer_opts_svg)

    # 2. DUN as EAN-13 PNG & SVG
    dun_code = p["dun"]
    dun_ean_obj_png = EAN13(dun_code, writer=ImageWriter())
    dun_ean_png_path = os.path.join(PNG_DIR, f"{sku}_DUN_EAN13_{dun_code}")
    dun_ean_obj_png.save(dun_ean_png_path, options=writer_opts_png)

    dun_ean_obj_svg = EAN13(dun_code, writer=SVGWriter())
    dun_ean_svg_path = os.path.join(SVG_DIR, f"{sku}_DUN_EAN13_{dun_code}")
    dun_ean_obj_svg.save(dun_ean_svg_path, options=writer_opts_svg)

    # 3. DUN as ITF-14 PNG & SVG
    itf_code = p["dun_itf14"]
    dun_itf_obj_png = ITF(itf_code, writer=ImageWriter())
    dun_itf_png_path = os.path.join(PNG_DIR, f"{sku}_DUN_ITF14_{itf_code}")
    dun_itf_obj_png.save(dun_itf_png_path, options=writer_opts_itf_png)

    dun_itf_obj_svg = ITF(itf_code, writer=SVGWriter())
    dun_itf_svg_path = os.path.join(SVG_DIR, f"{sku}_DUN_ITF14_{itf_code}")
    dun_itf_obj_svg.save(dun_itf_svg_path, options=writer_opts_svg)

print("Raw barcodes generated successfully.")

# Create Formatted Composite Label Images (Pillow)
font_bold = ImageFont.truetype(r"C:\Windows\Fonts\arialbd.ttf", 20)
font_title = ImageFont.truetype(r"C:\Windows\Fonts\arialbd.ttf", 15)
font_sub = ImageFont.truetype(r"C:\Windows\Fonts\arial.ttf", 13)
font_bold_sm = ImageFont.truetype(r"C:\Windows\Fonts\arialbd.ttf", 12)
font_tiny = ImageFont.truetype(r"C:\Windows\Fonts\arial.ttf", 11)

def create_product_label_card(prod, barcode_type="EAN"):
    """Creates a high-res sticker/card label for printing or display."""
    width, height = 700, 360
    im = Image.new("RGB", (width, height), "white")
    draw = ImageDraw.Draw(im)

    # Outer border & shadow effect
    draw.rounded_rectangle([(8, 8), (width - 8, height - 8)], radius=12, outline="#CBD5E1", width=2)

    # Top accent bar
    accent = prod["color_accent"]
    draw.rounded_rectangle([(8, 8), (width - 8, 54)], radius=12, fill=accent)
    draw.rectangle([(8, 30), (width - 8, 54)], fill=accent) # square bottom corners of top header

    # Header text
    sku_text = f"SKU: {prod['sku']}"
    draw.text((24, 18), sku_text, fill="white", font=font_bold)
    type_badge = "UNIDADE INDIVIDUAL (EAN-13)" if barcode_type == "EAN" else "PACK MASTER / CAIXA (DUN-14)"
    draw.text((width - 24, 22), type_badge, fill="white", font=font_bold_sm, anchor="ra")

    # Product Name
    draw.text((24, 68), prod["name"], fill="#0F172A", font=font_title)
    sub_info = f"Sabor: {prod['flavor']} | Formato: {prod['pack_units']}"
    draw.text((24, 94), sub_info, fill="#475569", font=font_sub)

    # Divider line
    draw.line([(24, 118), (width - 24, 118)], fill="#E2E8F0", width=1)

    # Barcode image loading
    if barcode_type == "EAN":
        bc_filename = f"{prod['sku']}_EAN13_{prod['ean']}.png"
        code_str = prod["ean"]
        dim_info = [
            ("Tipo de Código:", "EAN-13 (GS1 Retail)"),
            ("Código Numérico:", code_str),
            ("Dimensão Unitário:", prod["unit_dim"]),
            ("Uso Recomendado:", "Ponto de Venda (PDV) / Consumidor"),
        ]
    else:
        bc_filename = f"{prod['sku']}_DUN_ITF14_{prod['dun_itf14']}.png"
        code_str = prod["dun_itf14"]
        dim_info = [
            ("Tipo de Código:", "DUN-14 / ITF-14 (Logística)"),
            ("EAN-13 Equivalente:", prod["dun"]),
            ("Código Numérico:", code_str),
            ("Dimensão do Pack:", prod["pack_dim"]),
            ("Uso Recomendado:", "Logística, Estoque & Transporte"),
        ]

    bc_img_path = os.path.join(PNG_DIR, bc_filename)
    if os.path.exists(bc_img_path):
        bc_img = Image.open(bc_img_path)
        # Resize barcode keeping aspect ratio
        bc_target_w = 340
        aspect = bc_img.height / bc_img.width
        bc_target_h = int(bc_target_w * aspect)
        bc_resized = bc_img.resize((bc_target_w, bc_target_h), Image.Resampling.LANCZOS)
        # Paste barcode on left side
        im.paste(bc_resized, (24, 130))

    # Right side meta information box
    meta_x = 380
    meta_y = 135
    draw.rounded_rectangle([(meta_x - 10, meta_y - 8), (width - 24, height - 20)], radius=8, fill="#F8FAFC", outline="#E2E8F0", width=1)

    curr_y = meta_y
    for label, val in dim_info:
        draw.text((meta_x, curr_y), label, fill="#64748B", font=font_tiny)
        draw.text((meta_x, curr_y + 15), val, fill="#0F172A", font=font_bold_sm)
        curr_y += 38

    return im

for p in PRODUCTS:
    card_ean = create_product_label_card(p, "EAN")
    card_ean_path = os.path.join(LABELS_DIR, f"etiqueta_{p['sku']}_EAN.png")
    card_ean.save(card_ean_path, quality=95)

    card_dun = create_product_label_card(p, "DUN")
    card_dun_path = os.path.join(LABELS_DIR, f"etiqueta_{p['sku']}_DUN.png")
    card_dun.save(card_dun_path, quality=95)

print("Composite label cards created.")

# Copy all generated PNGs to artifacts directory so markdown can embed them
for f in os.listdir(PNG_DIR):
    shutil.copy2(os.path.join(PNG_DIR, f), os.path.join(ARTIFACTS_IMG_DIR, f))

for f in os.listdir(LABELS_DIR):
    shutil.copy2(os.path.join(LABELS_DIR, f), os.path.join(ARTIFACTS_IMG_DIR, f))

print("Artifacts copied successfully.")

# Create Professional Printable PDF
class BarcodePDF(FPDF):
    def header(self):
        self.set_font("Helvetica", "B", 16)
        self.set_text_color(15, 23, 42)
        self.cell(0, 8, "CATÁLOGO DE CÓDIGOS DE BARRAS & ESPECIFICAÇÕES", new_x="LMARGIN", new_y="NEXT", align="C")
        self.set_font("Helvetica", "", 10)
        self.set_text_color(100, 116, 139)
        self.cell(0, 5, "Produtos High Protein Shake 8x330ml - Padrão EAN-13 e DUN-14 (Logística)", new_x="LMARGIN", new_y="NEXT", align="C")
        self.ln(5)
        self.set_draw_color(226, 232, 240)
        self.line(10, self.get_y(), 200, self.get_y())
        self.ln(5)

    def footer(self):
        self.set_y(-15)
        self.set_font("Helvetica", "I", 8)
        self.set_text_color(148, 163, 184)
        self.cell(0, 10, f"Página {self.page_no()}/{{nb}} - Gerado em Conformidade com Padrões GS1", align="C")

pdf = BarcodePDF(orientation="P", unit="mm", format="A4")
pdf.set_auto_page_break(auto=True, margin=15)
pdf.add_page()

for idx, p in enumerate(PRODUCTS):
    if idx > 0:
        pdf.ln(3)

    # Product Header Box
    pdf.set_fill_color(241, 245, 249)
    pdf.set_draw_color(203, 213, 225)
    pdf.rect(10, pdf.get_y(), 190, 12, "FD")

    pdf.set_xy(12, pdf.get_y() + 2)
    pdf.set_font("Helvetica", "B", 11)
    pdf.set_text_color(15, 23, 42)
    pdf.cell(30, 8, f"SKU: {p['sku']}", align="L")
    pdf.cell(110, 8, p["name"], align="L")
    pdf.set_font("Helvetica", "B", 9)
    pdf.cell(46, 8, f"Pack: {p['pack_dim']}", align="R")
    pdf.ln(13)

    start_y = pdf.get_y()

    # Left Column: Unit EAN-13
    pdf.set_fill_color(255, 255, 255)
    pdf.rect(10, start_y, 92, 62, "D")
    pdf.set_xy(12, start_y + 2)
    pdf.set_font("Helvetica", "B", 9)
    pdf.set_text_color(30, 41, 59)
    pdf.cell(88, 5, "CÓDIGO INDIVIDUAL (EAN-13)", align="C")
    pdf.ln(4)

    ean_img = os.path.join(PNG_DIR, f"{p['sku']}_EAN13_{p['ean']}.png")
    if os.path.exists(ean_img):
        pdf.image(ean_img, x=14, y=start_y + 8, w=84)

    pdf.set_xy(12, start_y + 49)
    pdf.set_font("Helvetica", "", 8)
    pdf.set_text_color(71, 85, 105)
    pdf.cell(88, 4, f"EAN: {p['ean']} | Dim: {p['unit_dim']}", align="C")
    pdf.set_xy(12, start_y + 54)
    pdf.set_font("Helvetica", "I", 7.5)
    pdf.cell(88, 4, "Finalidade: Ponto de Venda / Leitor de Caixa", align="C")

    # Right Column: Pack DUN-14
    pdf.rect(108, start_y, 92, 62, "D")
    pdf.set_xy(110, start_y + 2)
    pdf.set_font("Helvetica", "B", 9)
    pdf.set_text_color(30, 41, 59)
    pdf.cell(88, 5, "CÓDIGO DO PACK / CAIXA (DUN-14)", align="C")
    pdf.ln(4)

    dun_img = os.path.join(PNG_DIR, f"{p['sku']}_DUN_ITF14_{p['dun_itf14']}.png")
    if os.path.exists(dun_img):
        pdf.image(dun_img, x=112, y=start_y + 8, w=84)

    pdf.set_xy(110, start_y + 49)
    pdf.set_font("Helvetica", "", 8)
    pdf.set_text_color(71, 85, 105)
    pdf.cell(88, 4, f"DUN: {p['dun_itf14']} (EAN: {p['dun']})", align="C")
    pdf.set_xy(110, start_y + 54)
    pdf.set_font("Helvetica", "I", 7.5)
    pdf.cell(88, 4, f"Dim: {p['pack_dim']} | Finalidade: Logística / Atacado", align="C")

    pdf.set_y(start_y + 66)

pdf_output_path = os.path.join(BASE_DIR, "etiquetas_produtos.pdf")
pdf.output(pdf_output_path)
shutil.copy2(pdf_output_path, os.path.join(ARTIFACTS_DIR, "etiquetas_produtos.pdf"))

print(f"PDF generated successfully at {pdf_output_path}")
