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
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 generate_mandiri_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")

    c = canvas.Canvas(packet_path)

    # --- Register Figtree fonts (pastikan file font tersedia di FONT_DIR) ---
    FONT_ARIAL = os.path.join(FONT_DIR, "arialnarrow.ttf")    
    pdfmetrics.registerFont(TTFont("Arial", FONT_ARIAL))
    
    # --- 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()
    # List 3 bulan ke belakang (misal: Juli 2025 -> [4, 5, 6] = April, Mei, Juni)
    bulan_list = [(now.month - i - 1) % 12 + 1 for i in range(3)]
    tahun_list = [now.year if now.month - i - 1 >= 0 else now.year - 1 for i in range(3)]
    print("Bulan List:", bulan_list)

    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)

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

    # tanggal awal 
    tanggal_awal = f"01/{bulan_target:02d}/{str(tahun_target)[-2:]}"
    tanggal_akhir_str = f"{calendar.monthrange(tahun_target, bulan_target)[1]:02d}/{bulan_target:02d}/{str(tahun_target)[-2:]}"
    
    # no kartu NO. KARTU 4616 DIIKUTI RANDOM 12 DIGIT
    no_kartu = '4616' + ''.join(random.choices('0123456789', k=12))

    # last_10_digit from no_kartu
    last_10_digit = no_kartu[-10:]

    tigaDigit = random.randint(112, 145)
    duaDigit = random.randint(0, 50)

    tigaDigit_str = f"{tigaDigit}{duaDigit:02d}"

    halaman_total = random.randint(3, 50)
    halaman_str = f"{halaman_total}"

    satu_digit = random.randint(1, 9)
    norek = str(tigaDigit) + '-00-' + ''.join(random.choices('0123456789', k=7)) + '-' + str(satu_digit)
    
    # Nama nasabah (font light, size 7, hitam, rata kanan)
    c.setFont("Arial", 8)
    c.setFillColor(HexColor("#000000"))


    batas_kiri = 64.5
    batas_adr = 715.5     
    jarak = 10.5
    
    c.drawString(batas_kiri, batas_adr - jarak * 1, tigaDigit_str)   
    c.drawString(batas_kiri, batas_adr - jarak * 2, nama)   
    c.drawString(batas_kiri, batas_adr - jarak * 3, alamat1)   
    c.drawString(batas_kiri, batas_adr - jarak * 4, alamat2)   
    
    kel_kec = 'KEL ' + kel + " " if kel else ""
    if kec:
        kel_kec += 'KEC ' + kec
    
    c.drawString(batas_kiri, batas_adr - jarak * 5, kel_kec)
    c.drawString(batas_kiri, batas_adr - jarak * 6, kota_kab + " " + kodpos) 
    
    c.drawString(batas_kiri + 14.5, batas_adr - jarak * 6 - 20, last_10_digit) 

    batas_atas2 = 726
    batas_kiri2 = 433
    jarak_kiri = 10.5
    c.drawString(batas_kiri2, batas_atas2 - jarak_kiri * 1, norek)   
    c.drawString(batas_kiri2, batas_atas2 - jarak_kiri * 2, nama_produk)   
    
    # jika valuta kosong, maka isi Indonesia Rupiah
    if not valuta:
        valuta = "Indonesia Rupiah"
    c.drawString(batas_kiri2, batas_atas2 - jarak_kiri * 3, valuta)   
    c.drawString(batas_kiri2, batas_atas2 - jarak_kiri * 4, tanggal_awal +' s/d ' + tanggal_akhir_str)   
    c.drawString(batas_kiri2, batas_atas2 - jarak_kiri * 5, cabang)   
    c.drawString(batas_kiri2, batas_atas2 - jarak_kiri * 6, no_kartu)
    c.drawString(batas_kiri2, batas_atas2 - jarak_kiri * 7, npwp)   


    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)
