# ==============================================================
# server.py — נקודת כניסה ראשית
# Version: 2.1 (עם תמיכה ב-pywebview ו-Fallback)
#
# מבנה הפרויקט:
#   server.py         ← כאן (entry point בלבד)
#   py/
#     config.py       ← קבועים, BASE_DIR, לוג, heartbeat state
#     ytdlp.py        ← שליפה, תמונות, גרסה, עדכון yt-dlp
#     handlers.py     ← MyHandler + כל ה-routes
#     downloader.py   ← (עתידי) הורדת סרטונים / אודיו
# ==============================================================

import http.server
import socketserver
import os
import sys
import webbrowser
import threading
import time
import datetime

import py.config as cfg
from py.handlers import MyHandler


class ThreadingHTTPServer(socketserver.ThreadingMixIn, http.server.HTTPServer):
    daemon_threads = True

def run_server():
    """מפעיל את השרת הקיים. רץ בתהליכון (Thread) נפרד"""
    with ThreadingHTTPServer(('', cfg.PORT), MyHandler) as httpd:
        try:
            httpd.serve_forever()
        except KeyboardInterrupt:
            pass

if __name__ == "__main__":
    print()
    print('╔══════════════════════════════════════════╗')
    print(f'║   MyYouTube Server  —  port {cfg.PORT}          ║')
    print(f'║   http://localhost:{cfg.PORT}                ║')
    print('║   סגור חלון זה כדי לעצור את השרת        ║')
    print('╚══════════════════════════════════════════╝')
    print(f'\n  [תיקייה] {cfg.BASE_DIR}')
    print(f'  [זמן]    {datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")}')
    print(f'  [מצב]    השרת פועל — ממתין לחיבור...\n')

    # 1. הפעלת השרת ברקע (חובה כדי לא לחסום את חלון ה-UI)
    server_thread = threading.Thread(target=run_server, daemon=True)
    server_thread.start()
    time.sleep(0.5) # נותנים לשרת חצי שנייה לעלות
    
    url = f'http://localhost:{cfg.PORT}'
    use_fallback = False

    # 2. מנסים לפתוח חלון תוכנה (pywebview)
    try:
        import webview
        print("  [מערכת] מפעיל מצב חלון אפליקציה (pywebview)...")
        
        # פתיחת החלון. אפשר לשנות כאן מידות.
        window = webview.create_window(
            'MyYouTube', 
            url, 
            width=1200, 
            height=800,
            min_size=(800, 600)
        )
        
        # טעינת האייקון של הפרויקט אם הוא קיים (עוזר לחלק ממערכות ההפעלה)
        icon_path = os.path.join(cfg.BASE_DIR, 'icon.ico')
        if not os.path.exists(icon_path):
            icon_path = None
        
        # הלולאה עוצרת כאן עד שהחלון נסגר
        webview.start(icon=icon_path)
        
        # אם הגענו לכאן, המשתמש סגר את חלון האפליקציה (ה-X למעלה)
        print("\n[סגירה] חלון האפליקציה נסגר. השרת עוצר...")
        os._exit(0)

    except Exception as e:
        print(f"  [שגיאה] לא ניתן להפעיל pywebview: {e}")
        print("  [מערכת] עובר למצב דפדפן רגיל (Fallback)...")
        use_fallback = True

    # 3. גיבוי - פתיחה בדפדפן (אם pywebview לא הותקן או נכשל)
    if use_fallback:
        print(f"  [דפדפן] פותח {url}")
        webbrowser.open(url)
        
        # Watchdog - מופעל רק במצב דפדפן, עם השהייה ארוכה של 3 דקות (180 שניות)
        # כדי למנוע סגירה כשכרטיסייה נמצאת ברקע (הדפדפן מקפיא טיימרים ולכן פעימות הלב מתעכבות)
        def _watchdog():
            time.sleep(30)
            while True:
                time.sleep(10)
                if time.time() - cfg._last_heartbeat > 180:
                    print(f"\n[סגירה] לא התקבלה פעימת חיים מעל 3 דקות — השרת נסגר אוטומטית")
                    print(f"        {datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')}")
                    os._exit(0)
        threading.Thread(target=_watchdog, daemon=True).start()
        
        # משאירים את התהליך חי כדי שהשרת ימשיך לרוץ ברקע.
        try:
            while True:
                time.sleep(1)
        except KeyboardInterrupt:
            print("\n[סגירה] השרת נעצר ידנית (Ctrl+C)")
            os._exit(0)