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

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


def generate_bbri_pdf(data, template_path, output_path):
    from reportlab.lib.colors import HexColor
    from reportlab.lib.pagesizes import A4
    
    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, pagesize=(842, 595))  # A4 Landscape
    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}")
        
        # Gunakan ukuran yang sama dengan template
        c = canvas.Canvas(packet_path, pagesize=(template_width, template_height))
    except Exception as e:
        print(f"Error reading template size: {e}")
        # Fallback ke A4
        c = canvas.Canvas(packet_path, pagesize=A4)


    # --- Register fonts ---
    FONT_TAHOMA_BOLD = os.path.join(FONT_DIR, "tahomabd.ttf")
    FONT_TAHOMA = os.path.join(FONT_DIR, "tahoma.ttf")
    FONT_HELVETICA_BOLD = os.path.join(FONT_DIR, "helvetica-bold.ttf")
    
    pdfmetrics.registerFont(TTFont("Tahoma-Bold", FONT_TAHOMA_BOLD))
    pdfmetrics.registerFont(TTFont("Tahoma", FONT_TAHOMA))
    pdfmetrics.registerFont(TTFont("Helve-Bold", FONT_HELVETICA_BOLD))

    # --- Data ---
    cabang = data["cabang"]
    nama = data["nama"]
    alamat1 = data["alamat1"]
    alamat2 = data["alamat2"]
    kel = data["kel"]
    kec = data["kec"]
    kodpos = data["kodpos"]
    npwp = data["npwp"]
    unitkerja = cabang
    unitkerja_alamat1 = data["alamat1-cabang"] #'Jl.Pangeran Ayin No.1 Kel.Kenten Laut'
    unitkerja_alamat2 = data["alamat2-cabang"] #'Kec.Talang Kelapa Kab.Banyuasin'
    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)]

    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)

    tanggal_laporan = now.strftime("%d/%m/%y")

    footer_date_time = now.strftime("%m/%d/%Y %H:%M:%S")
    
    # Pilih salah satu bulan dan tahun secara acak
    idx = random.randint(0, 2)
    bulan_target = bulan_list[idx]
    tahun_target = tahun_list[idx]

    awal = datetime(tahun_target, bulan_target, 1)
    # Cari akhir bulan target
    if bulan_target == 12:
        akhir = datetime(tahun_target + 1, 1, 1) - timedelta(days=1)
    else:
        akhir = datetime(tahun_target, bulan_target + 1, 1) - timedelta(days=1)
   

    periode_awal_str = f"{awal.day:02d}/{awal.month:02d}/{awal.year}"    
    # hasil nya : 01/05/2025, ubah jadi 01/05/25
    periode_awal_str = f"{awal.day:02d}/{awal.month:02d}/{awal.year % 100}"
    periode_akhir_str = f"{akhir.day:02d}/{akhir.month:02d}/{akhir.year % 100}"

   
    # Nomor rekening random 11 digit
    norek = ''.join(random.choices('0123456789', k=15))


    # --- Draw ke PDF ---

    # Nama nasabah (font light, size 7, hitam, rata kanan)
    c.setFont("Tahoma-Bold", 10)
    c.setFillColor(HexColor("#000000"))
    # c.drawString(95, 726, cabang)      
    c.drawString(40, 693, nama)  
    c.setFont("Tahoma", 10)    
    batas = 667
    c.drawString(40, batas, alamat1)   
    c.drawString(40, batas - 12, alamat2)   
    
    # c.drawString(40, batas - 24, kel)   
    # cek if kel tidak kosng maka variabel kel_kec isi kel + kec, jika kosong maka hanya kec, jika semua kosong maka tidak print
    kel_kec = 'KEL. ' + kel + " " if kel else ""
    if kec:
        kel_kec += 'KEC. ' + kec
    c.drawString(40, batas - 24, kel_kec.upper() )

    

    c.drawString(40, batas - 36, kota_kab.upper() + " " + kodpos.upper())

    # no rek
    c.setFont("Tahoma", 8)
    c.drawString(126, 600, norek)



    c.setFont("Helve-Bold", 9)
    c.setFillColor(HexColor("#808080"))
    c.drawString(568, 35, '' + footer_date_time) 


    # Nomor rekening (font light, size 7, hitam)
    c.setFont("Tahoma", 8)
    c.setFillColor(HexColor("#000000"))
    c.drawString(432, 724, tanggal_laporan)
    c.drawString(432, 695, periode_awal_str + ' - ' + periode_akhir_str)


    batas_awal = 522
    c.drawString(432, 598, unitkerja)

    c.drawString(432, 573, unitkerja_alamat1)
    c.drawString(432, 563, unitkerja_alamat2)
    
    c.save()

    # Rest of the code remains the same
    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)