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

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


def generate_indihome_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_INTER_BOLD = os.path.join(FONT_DIR, "Inter_28pt-Bold.ttf") #Inter_28pt-ExtraBold
    # FONT_INTER_BOLD = os.path.join(FONT_DIR, "Inter_28pt-ExtraBold.ttf") #
    
    pdfmetrics.registerFont(TTFont("InterBold", FONT_INTER_BOLD))

    c.setFont("InterBold", 8.2)
    c.setFillColor(HexColor("#000000"))
    
    # --- Data ---
    nama = data["nama"]
    alamat1 = data["alamat1"]
    alamat2 = data["alamat2"]
    # alamat3 = data["alamat3"]
    kel = data["kel"]
    kec = data["kec"]
    kodpos = data["kodpos"]
    kota_kab = data["kota_kab"]
    provinsi = data["provinsi"]
    npwp_nik = data["npwp_nik"]

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

    # Format tanggal sesuai permintaan
    bulan_indo = [
        "", "Januari", "Februari", "Maret", "April", "Mei", "Juni",
        "Juli", "Agustus", "September", "Oktober", "November", "Desember"
    ]
    # tanggal_str = f"{awal.day} {bulan_indo[awal.month]} {awal.year} - {akhir.day} {bulan_indo[akhir.month]} {akhir.year}"    
    
    # PERIODE RANDOM 3 BULAN KE BELAKANG DARI BULAN SAAT INI, yang ditampilkan tangagl 1 dan tanggal 20 saja
    # contoh  1-Juni-2025 s/d 20-Juni-2025
    awal = datetime(tahun_target, bulan_target, 1)
    akhir = datetime(tahun_target, bulan_target, 20)
    
    # contoh  1-Juni-2025 s/d 20-Juni-2025, tgl 1 nya 1, bukan 01 
    periode = f"{awal.day}-{bulan_indo[awal.month]}-{awal.year} s/d {akhir.day}-{bulan_indo[akhir.month]}-{akhir.year}"

    bulan_berikut = bulan_target + 1
    tahun_berikut = tahun_target
    if bulan_berikut > 12:
        bulan_berikut = 1
        tahun_berikut += 1
    tgl_f = datetime(tahun_berikut, bulan_berikut, 1) - timedelta(days=1)
    # format tanggal misalnya 31-Mei-2025
    tgl_faktur_str = f"{tgl_f.day}-{bulan_indo[tgl_f.month]}-{tgl_f.year} "

    batas_akhir = datetime(tahun_target, bulan_target, 20)
    batas_akhir_str = f"20-{bulan_indo[bulan_berikut]}-{tahun_berikut} "
        
    # Halaman
    halaman_total = random.randint(2, 25)
    halaman_str = f"{halaman_total:02d}"

    
    # NO. INVOICE 001 DIIKUTI RANDOM 9 DIGIT
    no_invoice = '001' + ''.join(random.choices('0123456789', k=9))

    # NO. ACCOUNT RANDOM 8-10 DIGIT
    no_account = ''.join(random.choices('0123456789', k=random.randint(8, 10)))
    

    # NO. INDIHOME 11 DIIKUTI RANDOM 10 DIGIT
    no_indihome = '11' + ''.join(random.choices('0123456789', k=10))

    
    batas_kiri = 30
    batas_adr = 747     
    batas_adr2 = 749     
    jarak = 10
    
    c.drawString(batas_kiri, batas_adr - jarak * 1, nama)   
    c.drawString(batas_kiri, batas_adr - jarak * 2, alamat1)   
    c.drawString(batas_kiri, batas_adr - jarak * 3, alamat2)   
    
    kel_kec = 'KEL ' + kel + " " if kel else ""
    if kec:
        kel_kec += 'KEC ' + kec
    # c.drawString(40, batas - 24, kel_kec )

    c.drawString(batas_kiri, batas_adr - jarak * 4, kel_kec)
    c.drawString(batas_kiri, batas_adr - jarak * 5, kota_kab + " " + provinsi) 
    c.drawString(batas_kiri, batas_adr - jarak * 6, kodpos)

    c.drawString(312, 761.5, periode)

    kiri2 = 460
    # c.setFont("InterBold", 8)
    c.setFillColor(HexColor("#000000"))
    c.drawString(kiri2, batas_adr2 - jarak * 1, no_invoice)   
    c.drawString(kiri2, batas_adr2 - jarak * 2, npwp_nik)
    c.drawString(kiri2, batas_adr2 - jarak * 3, no_account)
    c.drawString(kiri2, batas_adr2 - jarak * 5, no_indihome)
    c.drawString(kiri2, batas_adr2 - jarak * 6, tgl_faktur_str)
    c.drawString(kiri2, batas_adr2 - jarak * 7, batas_akhir_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)
