from reportlab.pdfgen import canvas
from reportlab.pdfbase import pdfmetrics
from reportlab.pdfbase.ttfonts import TTFont
from PyPDF2 import PdfReader, PdfWriter
from datetime import datetime, timedelta
import random
import os
import uuid
import calendar
from reportlab.lib.utils import simpleSplit

BASE_DIR = os.path.dirname(os.path.abspath(__file__))
FONT_DIR = os.path.join(BASE_DIR, "../assets/fonts")


def generate_raya_pdf(data, template_path, output_path):
    from reportlab.lib.colors import HexColor
    TEMP_DIR = os.path.join(os.path.dirname(os.path.abspath(__file__)), "../static/tmp")
    os.makedirs(TEMP_DIR, exist_ok=True)

    packet_path = os.path.join(TEMP_DIR, f"temp_overlay_{uuid.uuid4().hex}.pdf")

    c = canvas.Canvas(packet_path)

    # --- Register Figtree fonts (pastikan file font tersedia di FONT_DIR) ---
    FONT_Times = os.path.join(FONT_DIR, "Helvetica.ttf")
    
    pdfmetrics.registerFont(TTFont("Times", FONT_Times))
    
    # --- Data ---
    nama = data["nama"]
    alamat1 = data["alamat1"]
        
    # Nama nasabah (font light, size 7, hitam, rata kanan)
    c.setFont("Times", 10)
    c.setFillColor(HexColor("#000000"))
    
    batas_kiri = 435
    batas_adr = 274     
    jarak = 11

    # NOMOR CIF RANDOM 10 DIGIT, 3 DIGIT PERTAMA 000
    no_cif = '000' + ''.join(random.choices('0123456789', k=7))

    batas_adr = 291     
    
    jarak = 11.5  # Jarak antar baris (line spacing)
    font_name = "Helvetica"
    font_size = 10
    max_width = 130  # Lebar maksimum teks dalam poin

    # Set font dulu supaya ukuran dihitung akurat
    c.setFont(font_name, font_size)

    # Potong teks berdasarkan lebar maksimum
    lines = simpleSplit(nama, font_name, font_size, max_width)

    # Gambar baris per baris ke bawah
    for i, line in enumerate(lines):
        y = batas_adr - i * jarak
        c.drawString(batas_kiri, y, line)


    batas_adr = 263     
    
    jarak = 11.5  # Jarak antar baris (line spacing)
    font_name = "Helvetica"
    font_size = 10
    max_width = 130  # Lebar maksimum teks dalam poin

    # Set font dulu supaya ukuran dihitung akurat
    c.setFont(font_name, font_size)

    # Potong teks berdasarkan lebar maksimum
    lines = simpleSplit(alamat1, font_name, font_size, max_width)

    # Gambar baris per baris ke bawah
    for i, line in enumerate(lines):
        y = batas_adr - i * jarak
        c.drawString(batas_kiri, y, line)


    c.drawString(batas_kiri, 189.5, no_cif)


    c.setFont("Times", 8.81)
    c.setFillColor(HexColor("#000000"))


    c.setFont("Times", 8.81)

    c.setFont("Times", 8.81)
    c.setFillColor(HexColor("#000000"))

    c.save()

    background = PdfReader(template_path)
    overlay = PdfReader(packet_path)
    writer = PdfWriter()

    page = background.pages[0]
    page.merge_page(overlay.pages[0])
    writer.add_page(page)

    with open(output_path, "wb") as f:
        writer.write(f)

    # Bersihkan file sementara
    if os.path.exists(packet_path):
        os.remove(packet_path)
