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

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


def get_template_size(template_path):
    try:
        template_reader = PdfReader(template_path)
        template_page = template_reader.pages[0]
        template_width = float(template_page.mediabox.width)
        template_height = float(template_page.mediabox.height)
        print(f"Template size: {template_width} x {template_height}")
        return (template_width, template_height)
    except Exception as e:
        print(f"Error reading template size: {e}")
        return A4  # fallback ke A4 default
    
def generate_permata_v2_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")

    page_size = get_template_size(template_path)

    # Buat canvas dengan ukuran yang sama
    c = canvas.Canvas(packet_path, pagesize=page_size)

    # --- Register Figtree fonts (pastikan file font tersedia di FONT_DIR) ---
    FONT_BSANS_MEDIUM = os.path.join(FONT_DIR, "BBLSans05-Medium.ttf")
    FONT_BSANS_REG = os.path.join(FONT_DIR, "BBLSans05-Regular.ttf")
    
    pdfmetrics.registerFont(TTFont("BSANS_MED", FONT_BSANS_MEDIUM))
    pdfmetrics.registerFont(TTFont("BSANS_REG", FONT_BSANS_REG))
    
    # --- Data ---
    cabang = data["cabang"]
    nama = data["nama"]
    nama_produk = data["nama_produk"]
    # npwp = data["npwp"]
    valuta = data["valuta"]
    alamat1 = data["alamat1"]
    alamat2 = data["alamat2"]
    # alamat3 = data["alamat3"]
    kel = data["kel"]
    kec = data["kec"]
    kodpos = data["kodpos"]
    kota_kab = data["kota_kab"]
    

    # Tanggal random dari 3 bulan ke belakang
    now = datetime.now()

    bulan_indo = [
        "", "Januari", "Februari", "Maret", "April", "Mei", "Juni",
        "Juli", "Agustus", "September", "Oktober", "November", "Desember"
    ]

    bulan_list = [(now.month - i - 1) % 12 + 1 for i in range(1, 4)]
    tahun_list = [now.year if now.month - i - 1 >= 0 else now.year - 1 for i in range(1, 4)]
    print("Bulan List:", bulan_list)
    # PERIODE 3 BULAN TERAKHIR RANDOM DARI BULAN SAAT contoh : 01 Juli 2024 - 31 Juli 2024

    # Pilih salah satu bulan dan tahun secara acak
    idx = random.randint(0, 2)
    bulan_target = bulan_list[idx]
    tahun_target = tahun_list[idx]

    # Ambil tanggal awal dan akhir bulan target
    awal = datetime(tahun_target, bulan_target, 1)
    akhir_hari = calendar.monthrange(tahun_target, bulan_target)[1]
    akhir = datetime(tahun_target, bulan_target, akhir_hari)

    periode_str = f"{awal.day:02d} {bulan_indo[awal.month]} {awal.year} - {akhir.day:02d} {bulan_indo[akhir.month]} {akhir.year}".upper()

    
    # data now dengan format : 20 Feburari 2025
    date_now_str = f"{now.day} {bulan_indo[now.month]} {now.year}".upper()
    
    # RANDOM ANGKA HURUF 7 DIGIT
    random_angka_huruf = ''.join(random.choices('0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ', k=7))


    halaman_first = random.randint(2, 5)
    halaman_total = random.randint(6, 99)
    # halaman_str = f"1/{halaman_total}"
    
    halaman_first_str = f"{halaman_first:02d}"
    halaman_last_str = f"{halaman_total:02d}"

    # RANDOM ANGKA 10-12 DIGIT
    norek = ''.join(random.choices('0123456789', k=random.randint(10, 12)))

    # --- Draw ke PDF ---
    
    # Nama nasabah (font light, size 7, hitam, rata kanan)
    c.setFont("BSANS_MED", 34)
    c.setFillColor(HexColor("#000000"))
    
    batas_kiri = 59
    batas_kiri2 = 1242
    batas_adr = 2588 #2548
    jarak = 40

    c.drawString(batas_kiri2, 2548, periode_str)   
    c.drawString(batas_kiri2, 2450, date_now_str)
    c.drawString(batas_kiri2, 2355, random_angka_huruf)   

    # halaman_last_str
    c.setFont("BSANS_REG", 26)
    c.drawString(1966, 156, halaman_first_str)
    c.drawString(2009, 156, halaman_last_str)
    
    c.setFont("BSANS_MED", 34)
    c.drawString(batas_kiri, batas_adr - jarak * 1, nama)   

    #norek 
    batas_no_rek = 370
    c.drawString(batas_no_rek, 2241 , norek)   
    c.drawString(batas_no_rek, 2151 , cabang)
    c.drawString(batas_no_rek, 2051 , nama_produk)
    c.drawString(batas_no_rek, 1960 , valuta)

    # c.drawString(batas_kiri, batas_adr - jarak * 2, alamat1)   
    c.setFont("BSANS_REG", 34)
    c.drawString(batas_kiri, batas_adr - jarak * 2, alamat1)   
    c.drawString(batas_kiri, batas_adr - jarak * 3, alamat2)   
    
    kel_kec = '' + kel + " " if kel else ""
    if kec:
        kel_kec += ', ' + kec
    
    c.drawString(batas_kiri, batas_adr - jarak * 4, kel_kec)
    c.drawString(batas_kiri, batas_adr - jarak * 5, kota_kab + " " + kodpos) 
    
    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)
