import tkinter as tk
from tkinter import filedialog, messagebox, ttk
from tkinterdnd2 import DND_FILES, TkinterDnD
from PIL import Image, ImageTk
import pillow_heif
import os

pillow_heif.register_heif_opener()


files_list = []


def add_files(event=None):
global files_list
new_files = root.tk.splitlist(event.data)
for f in new_files:
if os.path.isfile(f):
files_list.append(f)
update_listbox()


def choose_files():
global files_list
f = filedialog.askopenfilenames(filetypes=[("Images", "*.heic *.webp *.jpg *.png")])
files_list.extend(f)
update_listbox()


def choose_folder():
global files_list
folder = filedialog.askdirectory()
if folder:
for f in os.listdir(folder):
if f.lower().endswith((".heic", ".webp", ".jpg", ".png")):
files_list.append(os.path.join(folder, f))
update_listbox()


def update_listbox():
listbox.delete(0, tk.END)
for f in files_list:
listbox.insert(tk.END, os.path.basename(f))


def preview_image(event):
if not files_list:
return
try:
img = Image.open(files_list[listbox.curselection()[0]])
img.thumbnail((200, 200))
img = ImageTk.PhotoImage(img)
preview_label.config(image=img)
preview_label.image = img
except:
pass


def convert():
if not files_list:
return

out_dir = filedialog.askdirectory()
if not out_dir:
return

quality = quality_scale.get()
count = 0
total = len(files_list)

progress["maximum"] = total
progress["value"] = 0

for file in files_list:
try:
img = Image.open(file)
name = os.path.splitext(os.path.basename(file))[0]

if format_var.get() == "JPG":
img = img.convert("RGB")
img.save(os.path.join(out_dir, name + ".jpg"),
"JPEG", quality=quality, optimize=True)

else:
img.save(os.path.join(out_dir, name + ".png"),
"PNG", optimize=True)

count += 1
except:
pass

progress["value"] += 1
root.update_idletasks()

messagebox.showinfo("Done", f"{count} فایل تبدیل شد")


# GUI
root = TkinterDnD.Tk()
root.title("Pro Image Converter Ultra")
root.geometry("650x450")

root.drop_target_register(DND_FILES)
root.dnd_bind("<>", add_files)

# لیست فایل‌ها
listbox = tk.Listbox(root, width=40, height=15)
listbox.pack(side=tk.LEFT, padx=10, pady=10)
listbox.bind("<>", preview_image)

# پیش‌نمایش
preview_label = tk.Label(root)
preview_label.pack(side=tk.RIGHT, padx=10)

# دکمه‌ها
btn_frame = tk.Frame(root)
btn_frame.pack()

tk.Button(btn_frame, text="Add Files", command=choose_files).pack(side=tk.LEFT)
tk.Button(btn_frame, text="Add Folder", command=choose_folder).pack(side=tk.LEFT)

# فرمت
format_var = tk.StringVar(value="JPG")
tk.Radiobutton(root, text="JPG (کم حجم)", variable=format_var, value="JPG").pack()
tk.Radiobutton(root, text="PNG (کیفیت بالا)", variable=format_var, value="PNG").pack()

# کیفیت
tk.Label(root, text="JPEG Quality").pack()
quality_scale = ttk.Scale(root, from_=10, to=100, orient="horizontal")
quality_scale.set(85)
quality_scale.pack()

# Progress
progress = ttk.Progressbar(root, length=400)
progress.pack(pady=10)

# Convert
tk.Button(root, text="START CONVERT", bg="green", fg="white", height=2, command=convert).pack()

root.mainloop()

امکانات این نسخه (سطح حرفه‌ای)
:heavy_check_mark: Drag & Drop واقعی
:heavy_check_mark: Preview عکس انتخابی
:heavy_check_mark: تبدیل دسته‌ای حرفه‌ای
:heavy_check_mark: Progress bar واقعی
:heavy_check_mark: کنترل کیفیت JPG (کم کردن حجم فایل)
:heavy_check_mark: تبدیل HEIC / WEBP بدون مشکل
:heavy_check_mark: شبیه نرم‌افزار ویندوز واقعی