import csv
import os
import re
from io import BytesIO
from reportlab.pdfgen import canvas
from reportlab.lib.pagesizes import A4
from reportlab.pdfbase import pdfmetrics
from reportlab.pdfbase.ttfonts import TTFont
from pypdf import PdfReader, PdfWriter

# ------------------------------------------------------------------
# 1. Load a Chinese font
# ------------------------------------------------------------------
def load_chinese_font():
    """Register SimSun from simsun.ttc (sub-font 0) or fall back to SimHei."""
    if os.path.isfile("simsun.ttc"):
        pdfmetrics.registerFont(TTFont("SimSun", "simsun.ttc", subfontIndex=0))
        print("✅ Using SimSun (simsun.ttc, subfont 0)")
        return "SimSun"
    elif os.path.isfile("simhei.ttf"):
        pdfmetrics.registerFont(TTFont("SimHei", "simhei.ttf"))
        print("✅ Using SimHei (simhei.ttf)")
        return "SimHei"
    else:
        raise RuntimeError("❌ Please place simsun.ttc or simhei.ttf in this folder.")

FONT_NAME = load_chinese_font()
FONT_SIZE = 20

# ------------------------------------------------------------------
# 2. Paths & layout constants
# ------------------------------------------------------------------
TEMPLATE_PATH = "certificate.pdf"  # new template
CSV_PATH      = "recipients.csv"
OUT_DIR       = "kl"

PAGE_WIDTH, PAGE_HEIGHT = A4

# ✅ New coordinates (approx based on visual check)
Y_NAME = 450 
Y_IC = 420

os.makedirs(OUT_DIR, exist_ok=True)

# ------------------------------------------------------------------
# 3. Generate certificates
# ------------------------------------------------------------------
generated_names = []

with open(CSV_PATH, newline="", encoding="utf-8-sig") as f:
    reader = csv.DictReader(f)

    for row in reader:
        name = (row.get("Name") or "").strip()

        # ✅ If the name contains only alphabets and spaces, convert to uppercase
        if re.fullmatch(r"[A-Za-z\s]+", name):
            name = name.upper()
            
        ic   = (row.get("IC")   or "").strip()

        if not name:
            print("⏭️  Skipped row (no name found).")
            continue

        # ---- Create overlay ----
        buf = BytesIO()
        c = canvas.Canvas(buf, pagesize=A4)
        c.setFont(FONT_NAME, FONT_SIZE)

        # ✅ Name (centered horizontally)
        name_width = pdfmetrics.stringWidth(name, FONT_NAME, FONT_SIZE)
        x_name = (PAGE_WIDTH - name_width) / 2.0
        c.drawString(x_name, Y_NAME, name)

        # ✅ IC (centered horizontally, if present)
        if ic:
            ic_width = pdfmetrics.stringWidth(ic, FONT_NAME, FONT_SIZE)
            x_ic = (PAGE_WIDTH - ic_width) / 2.0
            c.drawString(x_ic, Y_IC, ic)

        c.save()
        buf.seek(0)
        overlay_page = PdfReader(buf).pages[0]

        # ---- Merge with template ----
        template_page = PdfReader(TEMPLATE_PATH).pages[0]
        if hasattr(template_page, "merge_page"):  # pypdf ≥3
            template_page.merge_page(overlay_page)
        else:
            template_page.mergePage(overlay_page)  # PyPDF2 fallback

        # ---- Save output ----
        name_clean = re.sub(r"[^\w\-一-龥]", "_", name)
        out_main = os.path.join(OUT_DIR, f"{name_clean}.pdf")

        writer = PdfWriter()
        writer.add_page(template_page)
        with open(out_main, "wb") as f_out:
            writer.write(f_out)
        print(f"✔ Created {out_main}")

        generated_names.append(name_clean)

# ------------------------------------------------------------------
# 4. Summary
# ------------------------------------------------------------------
print("\n🎯 Certificate generation completed.")
print(f"✅ Total generated: {len(generated_names)}")
