import tkinter as tk
from tkinter import filedialog, messagebox, simpledialog  # Добавляем simpledialog для askstring
from tkinter.ttk import Progressbar
import threading
import os
import subprocess
import json

# Проверяем и устанавливаем необходимые библиотеки
try:
    import yt_dlp
except ImportError:
    subprocess.check_call(["pip", "install", "yt-dlp"])
    import yt_dlp

# Путь к файлу настроек для хранения последней сохраненной папки
config_file = "config.json"

# Загрузка последней директории из файла настроек
def load_last_directory():
    if os.path.exists(config_file):
        with open(config_file, 'r') as f:
            config = json.load(f)
            return config.get("last_directory", "")
    return ""

# Сохранение последней директории в файл настроек
def save_last_directory(directory):
    with open(config_file, 'w') as f:
        json.dump({"last_directory": directory}, f)

# Хук для прогресса при использовании yt-dlp
def hook(d):
    if d['status'] == 'downloading':
        downloaded = d.get('downloaded_bytes', 0)
        total = d.get('total_bytes', 0)
        if total > 0:
            progress["value"] = (downloaded / total) * 100
            remaining_time = d.get('eta', 0)
            time_label.config(text=f"Time remaining: {remaining_time}s")
            root.update_idletasks()

# Функция для скачивания видео с любого ресурса (включая YouTube)
def download_video(url, download_path, file_name):
    ydl_opts = {
        'outtmpl': os.path.join(download_path, file_name + '.%(ext)s'),  # Пользователь задает имя файла
        'progress_hooks': [hook],
        'format': 'best'  # Выбор наилучшего качества по умолчанию
    }
    
    with yt_dlp.YoutubeDL(ydl_opts) as ydl:
        ydl.download([url])

# Функция для начала загрузки
def start_download():
    url = url_entry.get()
    if not url:
        messagebox.showerror("Error", "Please enter a valid URL.")
        return

    # Загрузка последней сохраненной папки
    initial_dir = load_last_directory()

    # Выбор папки сохранения
    download_path = filedialog.askdirectory(initialdir=initial_dir)
    if not download_path:
        return

    # Сохраняем последнюю использованную папку
    save_last_directory(download_path)

    # Запрос имени файла
    file_name = simpledialog.askstring("File Name", "Enter name for the downloaded file:")  # Используем simpledialog
    if not file_name:
        return

    # Начинаем загрузку с использованием yt-dlp для всех сайтов
    thread = threading.Thread(target=download_video, args=(url, download_path, file_name))
    thread.start()

# Функция для вставки ссылки из буфера обмена
def paste_from_clipboard():
    try:
        clipboard_content = root.clipboard_get()
        url_entry.delete(0, tk.END)  # Очистка текущего текста в поле ввода
        url_entry.insert(0, clipboard_content)  # Вставка текста из буфера обмена
    except tk.TclError:
        messagebox.showerror("Error", "No valid data in clipboard.")

# Настройка графического интерфейса
root = tk.Tk()
root.title("Video Downloader")

# Поле ввода URL
tk.Label(root, text="Enter Video URL:").pack(pady=10)
frame = tk.Frame(root)  # Используем фрейм для группировки поля ввода и кнопки
frame.pack(pady=5)

url_entry = tk.Entry(frame, width=50)
url_entry.pack(side=tk.LEFT, padx=10)

# Кнопка для вставки из буфера обмена
paste_button = tk.Button(frame, text="Paste from Clipboard", command=paste_from_clipboard)
paste_button.pack(side=tk.RIGHT)

# Кнопка выбора папки и начала загрузки
download_button = tk.Button(root, text="Download", command=start_download)
download_button.pack(pady=10)

# Прогресс-бар
progress = Progressbar(root, orient="horizontal", length=300, mode="determinate")
progress.pack(pady=10)

# Метка для отображения оставшегося времени
time_label = tk.Label(root, text="Time remaining: N/A")
time_label.pack(pady=5)

# Запуск главного цикла интерфейса
root.mainloop()