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_seabank_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, 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 Figtree fonts (pastikan file font tersedia di FONT_DIR) ---
    FONT_ROBO_BOLD = os.path.join(FONT_DIR, "Roboto-Bold.ttf")
    FONT_ROBO = os.path.join(FONT_DIR, "Roboto-Regular.ttf")
    
    pdfmetrics.registerFont(TTFont("RoboBold", FONT_ROBO_BOLD))
    pdfmetrics.registerFont(TTFont("Robo", FONT_ROBO))
    
    # --- Data ---
    nama = data["nama"]
    alamat1 = data["alamat1"]
    alamat2 = data["alamat2"]
    kel = data["kel"]
    kec = data["kec"]
    kota_kab = data["kota_kab"]
    provinsi = data["provinsi"]
    

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

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

    # # 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:]}"

    # format nya 01 APR 2025 sampai 30 APR 2025
    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 = awal.strftime("%d %b %Y").upper()  # Contoh: 01 APR 2025
    periode_akhir_str = akhir.strftime("%d %b %Y").upper()  # Contoh: 30 APR 2025
    periode = periode_awal_str + " sampai " + periode_akhir_str

    # RANDOM 8 HURUF A-Z
    random_letters = ''.join(random.choices('ABCDEFGHIJKLMNOPQRSTUVWXYZ', k=8))

    # YYMMDD TANGGAL TERAKHIR PADA RANDOM 3 BULAN KEBELAKANG DARI BULAN SEKARANG 
    tanggal_akhir = datetime(tahun_target, bulan_target, calendar.monthrange(tahun_target, bulan_target)[1])
    tanggal_akhir_str = tanggal_akhir.strftime("%y%m%d")


    rek_koran = f"S/N S01-{tanggal_akhir_str}{random_letters}"
    
    tanggal_hari_ini = now.strftime("%d %b %Y").upper()  # Contoh: 01 MAY 2025
    
    halaman_total = random.randint(2, 99)
    halaman_str = f"{halaman_total}"

    # NO NASABAH RANDOM 10 DIGIT, 3 DIGIT PERTAMA 001
    norek =  ''.join(random.choices('0123456789', k=12))

    # --- Draw ke PDF ---
    batas_kiri = 40
    batas_adr = 695
    jarak = 12
    
    c.setFont("Robo", 12)
    c.setFillColor(HexColor("#a2a2a2"))  
    c.drawRightString(558, 788, rek_koran)   
    c.drawRightString(558, 774, tanggal_hari_ini)   
    
    c.setFont("RoboBold", 15)
    c.setFillColor(HexColor("#000000"))
    c.drawString(batas_kiri, 727, nama)   

    c.setFont("Robo", 10)
    c.drawString(batas_kiri , 705, 'NO. REKENING SEABANK: ' + norek)   

    c.setFont("Robo", 9)
    c.drawString(batas_kiri, batas_adr - jarak * 1, alamat1)   
    c.drawString(batas_kiri, batas_adr - jarak * 2, alamat2)   
    
    kel_kec = 'KEL ' + kel + " " if kel else ""
    if kec:
        kel_kec += 'KEC ' + kec
    c.drawString(batas_kiri, batas_adr - jarak * 3, kel_kec)
    c.drawString(batas_kiri, batas_adr - jarak * 4, kota_kab + ", " + provinsi ) 
    c.drawString(batas_kiri, batas_adr - jarak * 5, 'INDONESIA')

    c.setFont("Robo", 10)
    c.setFillColor(HexColor("#9B9B9B"))
    c.drawString(221, 575, periode)

    c.setFont("Robo", 12)
    c.drawString(545, 42, halaman_str)
    
    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)
