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_super_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_OPEN_SEMI_BOLD = os.path.join(FONT_DIR, "OpenSans-Semibold.ttf")
    FONT_OPEN_BOLD = os.path.join(FONT_DIR, "OpenSans-Bold.ttf")
    FONT_OPEN_REG = os.path.join(FONT_DIR, "OpenSans-Regular.ttf")
    FONT_DEJA = os.path.join(FONT_DIR, "DejaVuSans.ttf")
    
    pdfmetrics.registerFont(TTFont("OpenBold", FONT_OPEN_BOLD))
    pdfmetrics.registerFont(TTFont("OpenReg", FONT_OPEN_REG))
    pdfmetrics.registerFont(TTFont("OpenSemiBold", FONT_OPEN_SEMI_BOLD))
    pdfmetrics.registerFont(TTFont("Deja", FONT_DEJA))
    
    # --- Data ---
    nama = data["nama"]
    alamat1 = data["alamat1"]
    alamat2 = data["alamat2"]
    kel = data["kel"]
    kec = data["kec"]
    kodpos = data["kodpos"]
    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:]}"

    # 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) 
    
    bulan_indo = [
        "", "Januari", "Februari", "Maret", "April", "Mei", "Juni",
        "Juli", "Agustus", "September", "Oktober", "November", "Desember"
    ]

    periode_awal_str = f"1 {bulan_indo[bulan_target][:3]} {str(tahun_target)[-2:]}"
    periode_akhir_str = f"{akhir.day} {bulan_indo[akhir.month][:3]} {str(akhir.year)[-2:]}"  

    periode_awal_str = f"1 Jan"
    periode_akhir_str = f"31 Des {str(akhir.year)[-2:]}"  

    periode = periode_awal_str + " - " + periode_akhir_str

    halaman_total = random.randint(2, 20)
    halaman_str = f"{halaman_total}"

    # --- Draw ke PDF ---
    batas_kiri = 566
    batas_adr = 745
    
    jarak = 8
    

    c.setFont("OpenSemiBold", 6)
    c.setFillColor(HexColor("#000000"))
    c.drawRightString(batas_kiri, 745, nama)   

    c.setFont("OpenReg", 6)
    c.drawRightString(batas_kiri, batas_adr - jarak * 1, alamat1)   
    c.drawRightString(batas_kiri, batas_adr - jarak * 2, alamat2)   
    
    kel_kec = '' + kel + " " if kel else ""
    if kec:
        kel_kec += ', ' + kec
    
    c.drawRightString(batas_kiri, batas_adr - jarak * 3, kel_kec + ", " + kota_kab + " " + provinsi ) 
    c.drawRightString(batas_kiri, batas_adr - jarak * 4, 'ID' + " " + kodpos )

    c.setFont("OpenSemiBold", 9.75)
    
    c.drawString(135, 630, periode)

    #no cif ID + RANDOM 12 DIGIT
    no_cif = 'ID' + ''.join(random.choices('0123456789', k=12))
    c.setFont("OpenSemiBold", 7.50)
    c.drawString(407, 630, no_cif)


    c.setFont("Deja", 8)
    # colort custom
    c.setFillColor(HexColor("#464646"))
    c.drawString(582, 17, 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)
