import os
import io
import tkinter as tk
from PIL import Image, ImageTk
import requests
import threading
import subprocess

# Импортируем функцию сбора базы данных из вашего модуля
from create_servises import get_database

# 1. Получаем базу данных сервисов
servs_db = get_database()

# 2. Инициализация главного окна Tkinter
root = tk.Tk()
root.title("Chrome Launcher")
root.iconbitmap("servises/icon.ico")
root.geometry("800x600")
root.configure(bg="#121214")  # Стильный темный фон

ram_images = {}
card_widgets = {}  # Словарь для хранения ссылок на виджеты карточек
cards_list = []    # Список всех карточек для адаптивной сетки
DEFAULT_ICON_SIZE = (48, 48)

# Создаем красивую заглушку на случай, если иконка не скачается
try:
    default_img = Image.new("RGBA", DEFAULT_ICON_SIZE, color="#4f46e5")
    default_icon = ImageTk.PhotoImage(default_img)
except Exception:
    default_icon = None


# 3. Функция для скачивания ОДНОЙ иконки (работает в своем потоке)
def download_single_icon(title, icon_url):
    if isinstance(icon_url, list) and len(icon_url) > 0:
        icon_url = icon_url[0]
        
    if icon_url:
        icon_url = str(icon_url).strip("[]'\" ")
        if icon_url.startswith("://gstatic.com"):
            icon_url = "https://" + icon_url
            
    if icon_url and (icon_url.startswith("http://") or icon_url.startswith("https://")):
        try:
            response = requests.get(icon_url, timeout=5, headers={'User-Agent': 'Mozilla/5.0'})
            if response.status_code == 200:
                image_data = io.BytesIO(response.content)
                img = Image.open(image_data)
                
                if img.mode != "RGBA":
                    img = img.convert("RGBA")
                    
                img = img.resize(DEFAULT_ICON_SIZE, Image.Resampling.LANCZOS)
                tk_img = ImageTk.PhotoImage(img)
                
                # Сохраняем в ОЗУ
                ram_images[title] = tk_img
                
                # Обновляем виджет на экране
                if title in card_widgets:
                    card_widgets[title].config(image=tk_img)
                return
        except Exception as e:
            print(f"[-] Ошибка загрузки для {title}: {e}")
            
    ram_images[title] = default_icon


# 4. Функция запуска фонового скачивания
def load_icons_to_ram_async():
    print("[*] Запуск асинхронного скачивания иконок...")
    for title, info in servs_db.items():
        icon_url = info.get("icon")
        ram_images[title] = default_icon
        
        thread = threading.Thread(
            target=download_single_icon, 
            args=(title, icon_url), 
            daemon=True
        )
        thread.start()


# 5. Функция ожидания закрытия Chrome
def wait_for_chrome(process):
    process.wait()
    print("[+] Chrome закрыт, возвращаем лаунчер")
    root.deiconify()


# 6. Функция открытия ссылки в вашей сборке Chrome + Скрытие + Фиксация CWD
def open_link(url):
    # Путь к папке, где лежит браузер
    CHROME_DIR = os.path.abspath("ChromeHandler")
    # Путь к самому исполняемому файлу
    PATH_TO_CHROME = os.path.join(CHROME_DIR, "chrome.exe")
    
    # Полностью скрываем окно лаунчера
    root.withdraw()
    print("[+] Лаунчер скрыт (withdraw)")
    
    if os.path.exists(PATH_TO_CHROME):
        try:
            # Запускаем браузер, передавая аргумент URL и фиксируя рабочий каталог (cwd)
            process = subprocess.Popen(
                [PATH_TO_CHROME, url], 
                cwd=CHROME_DIR  # <--- Задаем правильный рабочий каталог для вашей сборки Chrome
            )
            print(f"[+] Успешно запущен {PATH_TO_CHROME} с cwd={CHROME_DIR}")
            print(f"[+] Аргумент: {url}")
            
            # Поток для отслеживания закрытия браузера
            watcher_thread = threading.Thread(target=wait_for_chrome, args=(process,), daemon=True)
            watcher_thread.start()
            
        except Exception as e:
            print(f"[-] Ошибка при запуске процесса браузера: {e}")
            root.deiconify()  # Возвращаем лаунчер, если запуск сорвался
    else:
        print(f"[!] Файл браузера не найден по пути: {PATH_TO_CHROME}. Используем системный браузер.")
        import webbrowser
        webbrowser.open(url)
        root.deiconify()


# 7. Отрисовка интерфейса
main_frame = tk.Frame(root, bg="#121214")
main_frame.pack(fill="both", expand=True, padx=30, pady=30)

for title, info in servs_db.items():
    card = tk.Frame(main_frame, bg="#1e1e24", bd=1, relief="flat", highlightbackground="#2e2e38", highlightthickness=1)
    
    img_label = tk.Label(card, image=default_icon, bg="#1e1e24")
    img_label.pack(pady=(15, 5))
    card_widgets[title] = img_label
    
    text_label = tk.Label(card, text=title, fg="#ffffff", bg="#1e1e24", font=("Segoe UI", 10, "bold"), wraplength=120)
    text_label.pack(pady=(0, 15), padx=10)
    
    url = info.get("host")
    for widget in (card, img_label, text_label):
        widget.bind("<Button-1>", lambda event, link=url: open_link(link))
        
    def on_enter(event, c=card, wl=[img_label, text_label]):
        c.configure(bg="#2a2a35", highlightbackground="#4f46e5")
        for w in wl: w.configure(bg="#2a2a35")
        
    def on_leave(event, c=card, wl=[img_label, text_label]):
        c.configure(bg="#1e1e24", highlightbackground="#2e2e38")
        for w in wl: w.configure(bg="#1e1e24")
        
    card.bind("<Enter>", on_enter)
    card.bind("<Leave>", on_leave)
    img_label.bind("<Enter>", on_enter)
    text_label.bind("<Enter>", on_enter)
    
    cards_list.append(card)


# 8. Функция адаптивной перестройки сетки
def rearrange_grid(event=None):
    window_width = root.winfo_width() - 60
    card_width = 180
    
    columns = max(1, window_width // card_width)
    
    for i in range(12):
        main_frame.columnconfigure(i, weight=0)
        
    for index, card in enumerate(cards_list):
        row = index // columns
        col = index % columns
        card.grid(row=row, column=col, padx=15, pady=15, sticky="nsew")
        
    for i in range(columns):
        main_frame.columnconfigure(i, weight=1)

root.bind("<Configure>", rearrange_grid)

# Запускаем фоновую загрузку иконок
load_icons_to_ram_async()

root.mainloop()
