import tkinter as tk
from tkinter import filedialog, messagebox
import PyPDF2
import os


def split_pdf_by_ranges(input_pdf_path, output_dir, ranges_text):
    try:
        with open(input_pdf_path, 'rb') as infile:
            reader = PyPDF2.PdfReader(infile)
            total_pages = len(reader.pages)
            base_name = os.path.splitext(os.path.basename(input_pdf_path))[0]

            # Analyse des plages
            ranges = [r.strip() for r in ranges_text.split(',') if r.strip()]
            for idx, page_range in enumerate(ranges):
                if '-' not in page_range:
                    raise ValueError(f"Plage invalide : '{page_range}'. Utilisez le format 1-5.")
                start_str, end_str = page_range.split('-')
                start = int(start_str) - 1  # les pages commencent à 0
                end = int(end_str)

                if start < 0 or end > total_pages or start >= end:
                    raise ValueError(f"Plage incorrecte : '{page_range}'")

                writer = PyPDF2.PdfWriter()
                for i in range(start, end):
                    writer.add_page(reader.pages[i])

                output_pdf_path = os.path.join(output_dir, f"{base_name}_livret{idx+1}.pdf")
                with open(output_pdf_path, 'wb') as outfile:
                    writer.write(outfile)

                print(f"[OK] Livret {idx+1} : pages {start+1} à {end}")

            messagebox.showinfo("Succès", f"{len(ranges)} livrets ont été générés.")
    except Exception as e:
        messagebox.showerror("Erreur", f"Une erreur est survenue : {e}")


def browse_pdf():
    file_path = filedialog.askopenfilename(
        title="Sélectionnez un fichier PDF",
        filetypes=[("Fichiers PDF", "*.pdf")]
    )
    if file_path:
        entry_pdf_path.delete(0, tk.END)
        entry_pdf_path.insert(0, file_path)


def browse_output_dir():
    directory = filedialog.askdirectory(title="Sélectionnez le dossier de sortie")
    if directory:
        entry_output_dir.delete(0, tk.END)
        entry_output_dir.insert(0, directory)


def split_pdf_action():
    input_pdf_path = entry_pdf_path.get().strip()
    output_dir = entry_output_dir.get().strip()
    ranges_text = entry_ranges.get().strip()

    if not input_pdf_path:
        messagebox.showwarning("Attention", "Veuillez sélectionner un fichier PDF.")
        return
    if not output_dir:
        messagebox.showwarning("Attention", "Veuillez sélectionner un dossier de sortie.")
        return
    if not ranges_text:
        messagebox.showwarning("Attention", "Veuillez entrer au moins une plage de pages.")
        return
    if not os.path.isfile(input_pdf_path):
        messagebox.showerror("Erreur", "Le fichier PDF spécifié n'existe pas.")
        return
    if not os.path.isdir(output_dir):
        messagebox.showerror("Erreur", "Le dossier de sortie spécifié n'existe pas.")
        return

    split_pdf_by_ranges(input_pdf_path, output_dir, ranges_text)


# --- Création de la fenêtre principale ---
root = tk.Tk()
root.title("Découpage de PDF par plages de pages")

# --- Configuration des champs ---
frame_pdf = tk.Frame(root)
frame_pdf.pack(padx=10, pady=5, fill="x")

label_pdf = tk.Label(frame_pdf, text="Fichier PDF à découper :")
label_pdf.pack(side=tk.LEFT)

entry_pdf_path = tk.Entry(frame_pdf, width=50)
entry_pdf_path.pack(side=tk.LEFT, padx=5)

button_browse_pdf = tk.Button(frame_pdf, text="Parcourir...", command=browse_pdf)
button_browse_pdf.pack(side=tk.LEFT)

frame_output = tk.Frame(root)
frame_output.pack(padx=10, pady=5, fill="x")

label_output = tk.Label(frame_output, text="Dossier de sortie :")
label_output.pack(side=tk.LEFT)

entry_output_dir = tk.Entry(frame_output, width=50)
entry_output_dir.pack(side=tk.LEFT, padx=5)

button_browse_output = tk.Button(frame_output, text="Parcourir...", command=browse_output_dir)
button_browse_output.pack(side=tk.LEFT)

frame_ranges = tk.Frame(root)
frame_ranges.pack(padx=10, pady=5, fill="x")

label_ranges = tk.Label(frame_ranges, text="Plages de pages (ex: 1-8,9-16) :")
label_ranges.pack(side=tk.LEFT)

entry_ranges = tk.Entry(frame_ranges, width=40)
entry_ranges.pack(side=tk.LEFT, padx=5)

button_split = tk.Button(root, text="Découper le PDF", command=split_pdf_action, bg="lightblue")
button_split.pack(pady=10)

root.mainloop()
