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_ocbc_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, "times.ttf")
    
    pdfmetrics.registerFont(TTFont("Times", FONT_Times))
    
    # --- Data ---
    nama = data["nama"]
    alamat1 = data["alamat1"]
    
    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_tahun = f"{now.month:02d}/{str(now.year)[-2:]}"
    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)]
    
    # 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}"
    tanggal_cetak = f"{akhir.day:02d} {bulan_indo[akhir.month]} {akhir.year}"
    
    halaman_total = random.randint(2, 15)
    halaman_str = f"1/{halaman_total}"
    halaman_last_str = f"{halaman_total}"

    # Nomor rekening random 12 digit
    norek = ''.join(random.choices('0123456789', k=12))
    
    # Nama nasabah (font light, size 7, hitam, rata kanan)
    c.setFont("Times", 8)
    c.setFillColor(HexColor("#000000"))
    
    batas_kiri = 48
    batas_adr = 732     
    jarak = 10

    c.drawString(213, 762, bulan_tahun + '-' + halaman_str + '-' + ''.join(random.choices('0123456789', k=4)))    
    c.drawString(batas_kiri, batas_adr - jarak * 1, nama)   
    c.drawString(batas_kiri, batas_adr - jarak * 3, alamat1)   
    
    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) 
    
    batas_atas2 = 763
    batas_kiri2 = 392
    jarak_kiri = 12
    c.drawString(batas_kiri2, batas_atas2 - jarak_kiri * 1, norek)   
    c.drawString(batas_kiri2, 705.5, periode_str)
    c.drawString(batas_kiri2, 685.5, tanggal_cetak)

    c.drawString(410.5, 641, halaman_last_str)
    
    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)
