import tkinter as tk
from tkinter import filedialog, messagebox
from PIL import Image

def select_file(title, save=False):

    root = tk.Tk()
    root.withdraw()
    # Filtres larges pour éviter les problèmes de détection
    ftypes = [
        ("Images", "*.png *.PNG *.jpg *.JPG *.jpeg *.JPEG *.bmp *.BMP"),
        ("Tous les fichiers", "*.*")
    ]
    
    if save:
        path = filedialog.asksaveasfilename(title=title, defaultextension=".png", filetypes=[("PNG", "*.png")])
    else:
        path = filedialog.askopenfilename(title=title, filetypes=ftypes)
    
    root.destroy()
    return path

def hide_process():
    cover_path = select_file("1. Choisissez l'image HÔTE (Couverture)")
    if not cover_path: return
    
    secret_path = select_file("2. Choisissez l'image SECRÈTE (À cacher)")
    if not secret_path: return
    
    output_path = select_file("3. Enregistrer l'image résultat", save=True)
    if not output_path: return

    try:
        cover = Image.open(cover_path).convert('RGB')
        secret = Image.open(secret_path).convert('RGB').resize(cover.size)
        
        stego = Image.new('RGB', cover.size)
        
        for x in range(cover.size[0]):
            for y in range(cover.size[1]):
                r1, g1, b1 = cover.getpixel((x, y))
                r2, g2, b2 = secret.getpixel((x, y))
                
                # On remplace le dernier bit de l'hôte par le premier bit du secret
                new_pixel = (
                    (r1 & 0xFE) | (r2 >> 7),
                    (g1 & 0xFE) | (g2 >> 7),
                    (b1 & 0xFE) | (b2 >> 7)
                )
                stego.putpixel((x, y), new_pixel)
        
        stego.save(output_path, "PNG")
        messagebox.showinfo("Succès", f"Image cachée avec succès dans :\n{output_path}")
    except Exception as e:
        messagebox.showerror("Erreur", str(e))

def reveal_process():
    stego_path = select_file("Choisissez l'image qui contient un secret")
    if not stego_path: return
    
    output_path = select_file("Enregistrer l'image révélée", save=True)
    if not output_path: return

    try:
        stego = Image.open(stego_path).convert('RGB')
        revealed = Image.new('RGB', stego.size)
        
        for x in range(stego.size[0]):
            for y in range(stego.size[1]):
                r, g, b = stego.getpixel((x, y))
                
                # On extrait le dernier bit et on le remonte au maximum (0 ou 255)
                # pour que l'image soit bien visible
                rev_pixel = (
                    (r & 1) * 255,
                    (g & 1) * 255,
                    (b & 1) * 255
                )
                revealed.putpixel((x, y), rev_pixel)
        
        revealed.save(output_path, "PNG")
        messagebox.showinfo("Succès", f"Image secrète extraite dans :\n{output_path}")
    except Exception as e:
        messagebox.showerror("Erreur", str(e))

def main_menu():
    menu = tk.Tk()
    menu.title("Stéganographie LSB")
    menu.geometry("300x200")
    
    tk.Label(menu, text="Que souhaitez-vous faire ?", font=('Arial', 12, 'bold'), pady=20).pack()
    
    tk.Button(menu, text="Cacher une image", command=hide_process, width=20, bg="#e1f5fe").pack(pady=5)
    tk.Button(menu, text="Révéler une image", command=reveal_process, width=20, bg="#f1f8e9").pack(pady=5)
    
    menu.mainloop()

if __name__ == "__main__":
    main_menu()