from tkinterdnd2 import DND_FILES, TkinterDnD
import tkinter as tk
from tkinter import filedialog, messagebox
from ftplib import FTP
from tqdm import tqdm
import os
import threading

# FTP credentials
ftp_host = "premium333.web-hosting.com"
ftp_user = "battqyyu"
ftp_pass = "LnA6H9wpyI5E"
ftp_port = 21

# Remote directories
directories = ["./alidot.online/windows/pinterest"]

# Base download URL (CHANGE if needed)
base_url = "https://alidot.online/windows/pinterest/"

# Store uploaded files
uploaded_files = []

def upload_file(file_path):
    if not file_path or not os.path.isfile(file_path):
        status_label.config(text="Invalid file!")
        return

    file_size = os.path.getsize(file_path)
    remote_file_name = os.path.basename(file_path)

    try:
        ftp = FTP()
        ftp.connect(ftp_host, ftp_port)
        ftp.login(ftp_user, ftp_pass)

        with open(file_path, "rb") as f:
            for directory in directories:
                try:
                    ftp.cwd(directory)

                    with tqdm(total=file_size, unit='B', unit_scale=True,
                              desc=f"Uploading {remote_file_name}") as pbar:

                        def callback(data):
                            pbar.update(len(data))

                        f.seek(0)
                        ftp.storbinary(f"STOR {remote_file_name}", f, 1024, callback)

                except Exception as e:
                    print(f"Failed to upload to {directory}: {e}")

        ftp.quit()

        # Save file to uploaded list (avoid duplicates)
        if file_path not in uploaded_files:
            uploaded_files.append(file_path)
            file_listbox.insert(tk.END, remote_file_name)

        # Print exact downloadable URL
        full_url = base_url + remote_file_name
        print("Download URL:", full_url)

        status_label.config(text="Upload Complete!")

    except Exception as e:
        print("FTP Upload Failed:", e)
        status_label.config(text="Upload failed!")


def upload_multiple(files):
    for file in files:
        upload_file(file)


def browse_file():
    files = filedialog.askopenfilenames()
    if files:
        status_label.config(text="Uploading...")
        threading.Thread(target=upload_multiple, args=(files,), daemon=True).start()


def on_drop(event):
    files = root.tk.splitlist(event.data)
    status_label.config(text="Uploading...")
    threading.Thread(target=upload_multiple, args=(files,), daemon=True).start()


def reupload_selected():
    if not uploaded_files:
        status_label.config(text="No files uploaded yet!")
        return

    # If only one file → auto reupload
    if len(uploaded_files) == 1:
        status_label.config(text="Re-uploading...")
        threading.Thread(target=upload_file,
                         args=(uploaded_files[0],), daemon=True).start()
        return

    # If multiple → reupload selected
    selected_index = file_listbox.curselection()
    if not selected_index:
        messagebox.showwarning("Select File", "Please select a file to re-upload")
        return

    file_path = uploaded_files[selected_index[0]]
    status_label.config(text="Re-uploading...")
    threading.Thread(target=upload_file,
                     args=(file_path,), daemon=True).start()


# GUI
root = TkinterDnD.Tk()
root.title("Advanced FTP Uploader")
root.geometry("500x400")

label = tk.Label(root, text="Drag & Drop or Choose Files", font=("Arial", 12))
label.pack(pady=10)

drop_area = tk.Label(root, text="⬇ Drop Files Here ⬇",
                     relief="groove", bd=2, width=45, height=5, bg="white")
drop_area.pack(pady=10)

drop_area.drop_target_register(DND_FILES)
drop_area.dnd_bind('<<Drop>>', on_drop)

btn = tk.Button(root, text="Choose Files", command=browse_file,
                font=("Arial", 12))
btn.pack(pady=5)

# Listbox for uploaded files
file_listbox = tk.Listbox(root, width=60, height=6)
file_listbox.pack(pady=10)

reupload_btn = tk.Button(root, text="Re-upload Selected File",
                         command=reupload_selected,
                         font=("Arial", 12))
reupload_btn.pack(pady=5)

status_label = tk.Label(root, text="", font=("Arial", 11), fg="green")
status_label.pack(pady=5)

root.mainloop()