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 generate_republic_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_DEJA_BOLD = os.path.join(FONT_DIR, "DejaVuSans-Bold.ttf")
    FONT_DEJA = os.path.join(FONT_DIR, "DejaVuSans.ttf")
    
    pdfmetrics.registerFont(TTFont("DejaBold", FONT_DEJA_BOLD))
    pdfmetrics.registerFont(TTFont("Deja", FONT_DEJA))
    
    # --- Data ---
    nama = data["nama"]
    alamat1 = data["alamat1"]
    alamat2 = data["alamat2"]
    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 TAGIHAN RANDOM 26,27,28,29,30 3 BULAN KE BELAKANG DARI BULAN SEKARANG
    tanggal_tagihan = random.choice([26, 27, 28, 29, 30])
    # contoh format 03 Aug 2024 (pakai Aug)
    # cek jika bulan terpilih adalah bulan februari, maka pilihan 26, 27, 28 saja 
    if bulan_target == 2:
        tanggal_tagihan = random.choice([26, 27, 28])
    tanggal_tagihan_str = f"{tanggal_tagihan:02d} {calendar.month_abbr[bulan_target]} {tahun_target}"

    # TANGGAL JATUH TEMPO RANDOM (03,04,05) ditambah 1 BULAN DARI BULAN TANGGAL TAGIHAN
    tanggal_jatuh_tempo = random.choice([3, 4, 5])
    # contoh format 03 Aug 2024 (pakai Aug)
    # add one month to bulan_target
    tanggal_jatuh_tempo_str = f"{tanggal_jatuh_tempo:02d} {calendar.month_abbr[(bulan_target % 12) + 1]} {tahun_target if bulan_target < 12 else tahun_target + 1}"
    
   
    batas_kiri = 38
    batas_adr = 706     
    jarak = 10
    
    c.setFont("DejaBold", 10.76)
    c.setFillColor(HexColor("#7d034e"))
    c.drawString(batas_kiri, 712, nama)   

    c.setFont("DejaBold", 10.76)
    c.setFillColor(HexColor("#9b196e"))
    c.drawString(77, 594, tanggal_tagihan_str)   

    c.drawString(255, 594, tanggal_jatuh_tempo_str)   

    c.setFont("Deja", 9.22)
    c.setFillColor(HexColor("#8f7188"))
    
    c.drawString(batas_kiri, batas_adr - jarak * 1, alamat1 + " " + alamat2)   
    c.drawString(batas_kiri, batas_adr - jarak * 2, kota_kab + ", " + provinsi + " " + kodpos) 
    c.drawString(batas_kiri, batas_adr - jarak * 3, 'Indonesia')

    c.setFont("DejaBold", 10.76)
    c.setFillColor(HexColor("#707172"))
    # DIGIT PERTAMA RANDOM 1-3 dilanjutkan RANDOM 7 DIGIT
    tigaDigit = random.randint(1, 3)
    no_tagihan = str(tigaDigit) + ''.join(random.choices('0123456789', k=7))
    c.drawString(481, 765, no_tagihan)   

    # C DIIKUTI RANDOM 10-19 DIIKUTI RANDOM 5-6 DIGIT (TOTAL 8-9 DIGIT)
    id_pelanggan = 'C' + str(random.randint(10, 19)) + ''.join(random.choices('0123456789', k=random.randint(5, 6)))
    c.drawString(463, 676, id_pelanggan)

    c.setFont("DejaBold", 9.22)
    c.drawString(40, 554.5, alamat1 + " " + alamat2 + " " + kota_kab + ", " + provinsi + " " + 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)
