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
from reportlab.lib.utils import simpleSplit

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

def generate_aladin_pdf(data, template_path, output_path):
    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")
    
    FONT_OPEN_BOLD = os.path.join(FONT_DIR, "Poppins-Bold.ttf")
    FONT_OPEN_REG = os.path.join(FONT_DIR, "Poppins-Regular.ttf")

    pdfmetrics.registerFont(TTFont("Poppins-Bold", FONT_OPEN_BOLD))
    pdfmetrics.registerFont(TTFont("Poppins-Regular", FONT_OPEN_REG))
    
    c = canvas.Canvas(packet_path)

    # Data untuk Aladin
    nama = data["nama"]
    alamat = " ".join(filter(None, [
        data["alamat1"],
        data["alamat2"],
        data["kel"],
        data["kec"],
        data["kota_kab"],
        data["provinsi"],
        data["kodpos"]
        
    ]))
    halaman = f"{random.randint(2, 9)}"

    now = datetime.now()
    awal = (now - timedelta(days=now.day)).replace(day=1)
    akhir = now.replace(day=1) - timedelta(days=1)

    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} - {akhir.day:02d} {bulan_indo[awal.month]} {awal.year}"

    total = f"{random.randint(1_000_000, 20_000_000):,}".replace(",", ".") + ""

    c.setFont("Poppins-Bold", 8.63)
    c.drawString(28, 750, nama)
    c.setFont("Poppins-Regular", 8.64)

    # halaman
    c.drawString(561, 793, halaman)

    # c.drawString(28, 722, alamat)
    batas_kiri = 28
    batas_adr = 722
    jarak = 14  # Jarak antar baris (line spacing)
    font_name = "Poppins-Regular"
    font_size = 8.63
    max_width = 350  # Lebar maksimum teks dalam poin

    # Set font dulu supaya ukuran dihitung akurat
    c.setFont(font_name, font_size)

    # Potong teks berdasarkan lebar maksimum
    lines = simpleSplit(alamat, font_name, font_size, max_width)

    # Gambar baris per baris ke bawah
    for i, line in enumerate(lines):
        y = batas_adr - i * jarak
        c.drawString(batas_kiri, y, line)
    
    c.setFont("Poppins-Regular", 8.63)
    c.drawString(402, 722, periode_str)

    c.setFont("Poppins-Bold", 8.63)
    c.drawString(402, 692, total)

    c.drawRightString(557, 591, total)   
    c.setFont("Poppins-Bold", 8.63)
    
    c.drawRightString(557, 543, total)
    c.drawRightString(557, 508, total)
    
    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)