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 generate_mandiri_v3_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_Lucida = os.path.join(FONT_DIR, "ltype2.ttf")
    FONT_ebrima = os.path.join(FONT_DIR, "ebrima.ttf")
    FONT_Narrow = os.path.join(FONT_DIR, "arialnarrow.ttf")
    FONT_ArialNova = os.path.join(FONT_DIR, "ArialNova.ttf")
    #
    pdfmetrics.registerFont(TTFont("Lucida", FONT_Lucida))
    pdfmetrics.registerFont(TTFont("Ebrima", FONT_ebrima))
    pdfmetrics.registerFont(TTFont("Narrow", FONT_Narrow))
    pdfmetrics.registerFont(TTFont("ArialNova", FONT_ArialNova))

    # --- 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)

    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 di bulan yang sama
    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:]

    # 2 digit terakhir
    #random 00-50
    tigaDigit = random.randint(112, 145)
    duaDigit = random.randint(0, 50)

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

    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("Lucida", 8.81)
    c.setFillColor(HexColor("#000000"))
    
    batas_kiri = 88
    batas_adr = 722     
    
    jarak = 12

    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.setFont("Ebrima", 8)
    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 + 15, batas_adr - jarak * 6 - 29, last_10_digit) 

    batas_atas2 = 733
    batas_kiri2 = 433
    jarak_kiri = 12
    c.drawString(batas_kiri2, batas_atas2 - jarak_kiri * 1, norek)   
    c.drawString(batas_kiri2, batas_atas2 - jarak_kiri * 2, nama_produk)   
    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)
