import fitz  # PyMuPDF
import tkinter as tk
from tkinter import filedialog, messagebox
import datetime
import os

def get_font_size(page, search_str):
    """Extract font size for a given placeholder string."""
    blocks = page.get_text("dict")["blocks"]
    for b in blocks:
        for line in b.get("lines", []):
            for span in line.get("spans", []):
                if search_str in span["text"]:
                    return span["size"]
    return 12

def replace_placeholders(input_pdf, replacements):
    doc = fitz.open(input_pdf)
    default_font = "helv"
    name_for_filename = ""

    for page in doc:
        for old_text, new_text in replacements.items():
            text_instances = page.search_for(old_text)
            if not text_instances:
                continue

            font_size = get_font_size(page, old_text)

            for inst in text_instances:
                page.add_redact_annot(inst, fill=(1, 1, 1))
            page.apply_redactions()

            for inst in text_instances:
                page.insert_text(inst.tl, new_text, fontsize=font_size, fontname=default_font)

        if "{{name}}" in replacements:
            name_for_filename = replacements["{{name}}"].strip().replace(" ", "_")

    date_code = datetime.datetime.now().strftime("%m%d%y")
    output_filename = f"{name_for_filename}{date_code}.pdf" if name_for_filename else f"output_{date_code}.pdf"

    output_path = os.path.join(os.path.dirname(input_pdf), output_filename)
    doc.save(output_path)
    return output_path

# GUI
class TemplateFillerApp:
    def __init__(self, root):
        self.root = root
        self.root.title("PDF Template Filler")

        self.template_path = None

        # UI Layout
        tk.Button(root, text="Choose PDF Template", command=self.choose_file).pack(pady=10)

        self.template_label = tk.Label(root, text="No template selected")
        self.template_label.pack()

        self.name_var = tk.StringVar()
        self.position_var = tk.StringVar()
        self.supervisor_var = tk.StringVar()

        self.build_form()

        tk.Button(root, text="Generate PDF", command=self.generate_pdf).pack(pady=20)

    def build_form(self):
        self.add_entry("Name", self.name_var)
        self.add_entry("Position", self.position_var)
        self.add_entry("Supervisor", self.supervisor_var)

    def add_entry(self, label_text, var):
        frame = tk.Frame(self.root)
        frame.pack(pady=5)
        tk.Label(frame, text=label_text + ": ", width=12, anchor="e").pack(side=tk.LEFT)
        tk.Entry(frame, textvariable=var, width=40).pack(side=tk.LEFT)

    def choose_file(self):
        path = filedialog.askopenfilename(filetypes=[("PDF files", "*.pdf")])
        if path:
            self.template_path = path
            self.template_label.config(text=os.path.basename(path))

    def generate_pdf(self):
        if not self.template_path:
            messagebox.showerror("Error", "Please select a template PDF.")
            return

        replacements = {
            "{{name}}": self.name_var.get(),
            "{{position}}": self.position_var.get(),
            "{{supervisor}}": self.supervisor_var.get(),
        }

        try:
            output_path = replace_placeholders(self.template_path, replacements)
            messagebox.showinfo("Success", f"PDF saved as:\n{output_path}")
        except Exception as e:
            messagebox.showerror("Error", f"Failed to generate PDF:\n{e}")

# Run the GUI
if __name__ == "__main__":
    root = tk.Tk()
    app = TemplateFillerApp(root)
    root.mainloop()
