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.pagesizes import A4

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


def get_template_size(template_path):
    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}")
        return (template_width, template_height)
    except Exception as e:
        print(f"Error reading template size: {e}")
        return A4  # fallback ke A4 default
    
def generate_permata_v1_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")

    page_size = get_template_size(template_path)

    # Buat canvas dengan ukuran yang sama
    c = canvas.Canvas(packet_path, pagesize=page_size)

    # --- Register Figtree fonts (pastikan file font tersedia di FONT_DIR) ---
    FONT_BSANS_MEDIUM = os.path.join(FONT_DIR, "BBLSans05-Medium.ttf")
    FONT_BSANS_REG = os.path.join(FONT_DIR, "BBLSans05-Regular.ttf")
    FONT_BSANS_ITALIC = os.path.join(FONT_DIR, "BBLSans05-RegularItalic.ttf")
    
    pdfmetrics.registerFont(TTFont("BSANS_MED", FONT_BSANS_MEDIUM))
    pdfmetrics.registerFont(TTFont("BSANS_REG", FONT_BSANS_REG))
    pdfmetrics.registerFont(TTFont("BSANS_ITALIC", FONT_BSANS_ITALIC))
    
    # --- Data ---
    cabang = data["cabang"]
    nama = data["nama"]
    nama_produk = data["nama_produk"]
    # npwp = data["npwp"]
    valuta = data["valuta"]
    alamat1 = data["alamat1"]
    alamat2 = data["alamat2"]
    # alamat3 = data["alamat3"]
    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_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)]
    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]

    # 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}".upper()

    peride_last_str = f"Ekuivalen Saldo Rupiah – {akhir.day:02d} {bulan_indo[akhir.month]} {akhir.year}"
    
    # --- MODIFIED SECTION ---
    # Calculate the first day of the next month
    if akhir.month == 12:
        next_month_start = datetime(akhir.year + 1, 1, 1)
    else:
        next_month_start = datetime(akhir.year, akhir.month + 1, 1)
    
    # data now dengan format : 20 Feburari 2025
    date_now_str = f"{next_month_start.day} {bulan_indo[next_month_start.month]} {next_month_start.year}".upper()
    
    # RANDOM ANGKA HURUF 7 DIGIT
    random_angka_huruf = ''.join(random.choices('0123456789ABCDEFGHIJKLMNOPRSTUVWXYZ', k=7))
    
    halaman_total = random.randint(2, 15)
    # halaman_str = f"1/{halaman_total}"
    halaman_str_part1 = f"Halaman/"
    halaman_str_part2 = "Page"
    halaman_str_part3 = f" 01/{halaman_total:02d}"
    
    batas_kiri = 59
    batas_kiri2 = 1245
    batas_kanan = 2040
    batas_adr = 2545     
    
    jarak = 40

    c.setFont("BSANS_MED", 34)
    c.setFillColor(HexColor("#000000"))
    
    c.drawString(batas_kiri2, 2548, periode_str)   

    c.drawString(batas_kiri2, 2453, date_now_str)   

    c.drawString(batas_kiri2, 2357.5, random_angka_huruf)   

    c.setFont("BSANS_MED", 44)
    text_width = c.stringWidth(peride_last_str, "BSANS_MED", 44)
    x_pos = batas_kanan - text_width
    c.drawString(x_pos, 2118, peride_last_str)   

    # --- Right-align the entire halaman_last_str line ---
    c.setFont("BSANS_REG", 26)
    # Calculate the total width of all three parts
    width_part1 = c.stringWidth(halaman_str_part1, "BSANS_REG", 26)
    c.setFont("BSANS_ITALIC", 26)
    width_part2 = c.stringWidth(halaman_str_part2, "BSANS_ITALIC", 26)
    c.setFont("BSANS_REG", 26)
    width_part3 = c.stringWidth(halaman_str_part3, "BSANS_REG", 26)
    
    total_width = width_part1 + width_part2 + width_part3
    
    # Calculate the starting X position for the entire line
    start_x = batas_kanan - total_width
    
    # Draw the first part (regular)
    c.setFont("BSANS_REG", 26)
    c.drawString(start_x, 156, halaman_str_part1)
    
    # Draw the second part (italic)
    c.setFont("BSANS_ITALIC", 26)
    x_pos_part2 = start_x + width_part1
    c.drawString(x_pos_part2, 156, halaman_str_part2)

    # Draw the third part (regular)
    c.setFont("BSANS_REG", 26)
    x_pos_part3 = x_pos_part2 + width_part2
    c.drawString(x_pos_part3, 156, halaman_str_part3)
    
    c.setFont("BSANS_MED", 34)
    c.drawString(batas_kiri, batas_adr - jarak * 1, nama)   
    # c.drawString(batas_kiri, batas_adr - jarak * 2, alamat1)   
    c.setFont("BSANS_REG", 34)
    c.drawString(batas_kiri, batas_adr - jarak * 2, alamat1)   
    c.drawString(batas_kiri, batas_adr - jarak * 3, alamat2)   
    
    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) 
    
    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)
