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

from datetime import datetime, timedelta
import random
import os
import uuid
import calendar
import tempfile

# Register custom fonts
# Path absolut ke direktori ini
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
FONT_DIR = os.path.join(BASE_DIR, "../assets/fonts")

# Path ke file font
FONT_BOLD_PATH = os.path.join(FONT_DIR, "BCASans-Bold.ttf")
FONT_REGULAR_PATH = os.path.join(FONT_DIR, "BCASans-Regular.ttf")

# Register custom fonts
pdfmetrics.registerFont(TTFont("Bold", FONT_BOLD_PATH))
pdfmetrics.registerFont(TTFont("Regular", FONT_REGULAR_PATH))

if not os.path.isfile(FONT_BOLD_PATH) or not os.path.isfile(FONT_REGULAR_PATH):
    raise FileNotFoundError("Font Poppins tidak ditemukan di path yang ditentukan.")


def draw_string_with_charspace(c, x, y, text, font_name, font_size, char_space=0.7):
    t = c.beginText()
    t.setTextOrigin(x, y)
    t.setFont(font_name, font_size)
    t.setCharSpace(char_space)
    t.textLine(text)
    c.drawText(t)
    
def draw_halaman_with_charspace(c, x, y, text, font_name, font_size, char_space=1.5):
    t = c.beginText()
    t.setTextOrigin(x, y)
    t.setFont(font_name, font_size)
    t.setCharSpace(char_space)
    t.textLine(text)
    c.drawText(t)

def draw_centred_string_with_charspace(c, x, y, text, font_name, font_size, char_space=0.7):
    width = pdfmetrics.stringWidth(text, font_name, font_size) + (len(text)-1)*char_space
    t = c.beginText()
    t.setTextOrigin(x - width/2, y)
    t.setFont(font_name, font_size)
    t.setCharSpace(char_space)
    t.textLine(text)
    c.drawText(t)   

def generate_bbca_pdf(data, template_path, output_path):
    # rekening, halaman, periode = generate_random_bbca_data()
    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)

    # Judul tengah
    c.setFont("Bold", 17)
    # c.drawCentredString(300, 798, data.get("judul", ""))
    draw_centred_string_with_charspace(c, 300, 795, data.get("judul", ""), "Bold", 17, 0.7)

    # Kanan atas
    c.setFont("Bold", 7)
    cabang = data["cabang"]
    nama = data["nama"]
    alamat1 = data["alamat1"]
    alamat2 = data["alamat2"]
    kel = data["kel"]
    kec = data["kec"]
    kodpos = data["kodpos"]
    kota_kab = data["kota_kab"]
    
    now = datetime.now()

    norek = ''.join(random.choices('1234567890', k=10))
    halaman_total = random.randint(1, 9)
    halaman_str = f"{halaman_total}/{halaman_total}"

    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"{bulan_indo[awal.month].upper()} {awal.year}"

    batas_norek = 435.5
    draw_string_with_charspace(c, batas_norek, 755.5, norek, "Bold", 7)
    draw_halaman_with_charspace(c, batas_norek, 740, halaman_str, "Bold", 7)
    draw_string_with_charspace(c, batas_norek, 723, periode_str, "Bold", 7)
    draw_string_with_charspace(c, batas_norek, 707, 'IDR', "Bold", 7)
    
    c.setFont("Regular", 7)

    c.setFont("Bold", 6)
    draw_string_with_charspace(c, 30, 774, cabang, "Bold", 6)


    c.setFont("Bold", 7)
    
    batas_kiri = 31
    batas_adr = 766
    jarak = 12
    baris = 0
    
    baris = baris + 1
    draw_string_with_charspace(c, batas_kiri, batas_adr - jarak * baris, nama, "Bold", 7)
    print("cek nama batas_adr:", batas_adr, "jarak:", jarak, "baris:", baris, "jarak * baris:", jarak * baris)
    
    baris = baris + 1
    draw_string_with_charspace(c, batas_kiri, batas_adr - jarak * baris, kel, "Bold", 7)
    print("cek kel batas_adr:", batas_adr, "jarak:", jarak, "baris:", baris, "jarak * baris:", jarak * baris)
    
    kec_alamat2 = ""
    if kec and alamat2:
        kec_alamat2 = kec + " " + alamat2
    elif kel:
        kec_alamat2 = kec
    elif kec:
        kec_alamat2 = alamat2

    if kec_alamat2:
        baris = baris + 1
        draw_string_with_charspace(c, batas_kiri, batas_adr - jarak * baris, kec_alamat2, "Bold", 7)
        print("cek kec_alamat2 batas_adr:", batas_adr, "jarak:", jarak, "baris:", baris, "jarak * baris:", jarak * baris)
    
    baris = baris + 1
    draw_string_with_charspace(c, batas_kiri, batas_adr - jarak * baris, alamat1, "Bold", 7)
    print("cek alamat1 batas_adr:", batas_adr, "jarak:", jarak, "baris:", baris, "jarak * baris:", jarak * baris)
    
    baris = baris + 1
    draw_string_with_charspace(c, batas_kiri, batas_adr - jarak * baris, kota_kab + " " + kodpos, "Bold", 7)
    print("cek kota_kab batas_adr:", batas_adr, "jarak:", jarak, "baris:", baris, "jarak * baris:", jarak * baris)

    baris = baris + 1
    draw_string_with_charspace(c, batas_kiri, batas_adr - jarak * baris, 'INDONESIA', "Bold", 7)
    print("cek negara batas_adr:", batas_adr, "jarak:", jarak, "baris:", baris, "jarak * baris:", jarak * baris)
    

    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)