"""
cx_Freeze setup script for YTSage with FFmpeg bundle
Supports building executables, MSI installers, and ZIP distributions with FFmpeg
"""

import sys
from pathlib import Path
from cx_Freeze import setup, Executable
import os

# Get FFmpeg path from environment variable or use default
FFMPEG_PATH = os.environ.get('FFMPEG_PATH', r'C:\Users\atela\AppData\Local\ffmpeg\ffmpeg-7.1.1-full_build\bin')

# Build options for executable
build_exe_options = {
    # Packages to include
    "packages": [
        "PySide6.QtCore",
        "PySide6.QtGui", 
        "PySide6.QtWidgets",
        "src.gui.ytsage_gui_main",
        "src.core.ytsage_utils",
        "src.core.ytsage_downloader",
        "src.core.ytsage_ffmpeg",
        "src.core.ytsage_yt_dlp",
        "src.core.ytsage_style",
        "src.core.ytsage_logging",
        "src.gui.ytsage_gui_format_table",
        "src.gui.ytsage_gui_video_info",
        "src.gui.ytsage_gui_dialogs",
        "src.gui.ytsage_gui_dialogs.ytsage_dialogs_base",
        "src.gui.ytsage_gui_dialogs.ytsage_dialogs_custom",
        "src.gui.ytsage_gui_dialogs.ytsage_dialogs_ffmpeg",
        "src.gui.ytsage_gui_dialogs.ytsage_dialogs_selection",
        "src.gui.ytsage_gui_dialogs.ytsage_dialogs_settings",
        "src.gui.ytsage_gui_dialogs.ytsage_dialogs_update",
        "src.utils.ytsage_constants",
        # Additional packages that might be needed
        "requests",
        "PIL",  # Pillow is imported as PIL
        "packaging",
        "markdown",
        "playsound3",
        "loguru",
        "setuptools"
    ],
    
    # Packages to exclude (to reduce size)
    "excludes": [
        "PySide6.QtBluetooth",
        "PySide6.QtNetwork",
        "PySide6.QtOpenGL",
        "PySide6.QtPrintSupport",
        "PySide6.QtSvg",
        "PySide6.QtTest",
        "PySide6.QtXml",
        "PySide6.QtSql",
        "PySide6.QtHelp",
        "PySide6.QtMultimedia",
        "PySide6.QtQml",
        "PySide6.QtQuick",
        "PySide6.QtWebEngineCore",
        "PIL.ImageDraw",
        "PIL.ImageFont",
        "numpy",
        "scipy",
        "wx",
        "pandas",
        "tkinter",
        "yt_dlp",  # Excluded - downloaded dynamically at runtime (all imports are conditional)
        "unittest",
        "test",
        "tests"
    ],
    
    # Include files (assets + FFmpeg binaries)
    "include_files": [
        ("assets/Icon/icon.png", "assets/Icon/icon.png"),
        ("assets/sound/notification.mp3", "assets/sound/notification.mp3"),
        ("assets/branding/icons/YTSage.ico", "YTSage.ico"),
        # FFmpeg binaries
        (os.path.join(FFMPEG_PATH, "ffmpeg.exe"), "ffmpeg.exe"),
        (os.path.join(FFMPEG_PATH, "ffprobe.exe"), "ffprobe.exe"),
        (os.path.join(FFMPEG_PATH, "ffplay.exe"), "ffplay.exe"),
    ],
    
    # Zip includes (can help reduce file count)
    "zip_include_packages": "*",
    "zip_exclude_packages": [],
    
    # Other options
    "optimize": 2,  # Optimize bytecode
    "build_exe": "dist/YTSage-FFmpeg",  # Output directory for executable
}

# MSI build options
bdist_msi_options = {
    "upgrade_code": "{87654321-4321-8765-CBA9-987654321CBA}",  # Different GUID for FFmpeg version
    "add_to_path": False,
    "initial_target_dir": r"[ProgramFilesFolder]\YTSage",
    "install_icon": "assets/branding/icons/YTSage.ico",
    "summary_data": {
        "author": "oop7",
        "comments": "YouTube Video Downloader with FFmpeg - Complete video processing solution",
        "keywords": "youtube, downloader, video, audio, converter, ffmpeg"
    }
}

# Base configuration for Windows GUI application
base = None
if sys.platform == "win32":
    base = "Win32GUI"  # This prevents console window from appearing

# Executable configuration
executable = Executable(
    "main.py",
    base=base,
    icon="assets/branding/icons/YTSage.ico",
    target_name="YTSage-v4.8.0-ffmpeg.exe",
    copyright="Copyright (c) 2024-2025 YTSage",
    trademarks="YTSage"
)

# Setup configuration
setup(
    name="YTSage-FFmpeg",
    version="4.8.0",
    description="YouTube Video Downloader with FFmpeg",
    author="oop7",
    author_email="oop7_support@proton.me",
    url="https://github.com/oop7/ytsage",
    license="MIT",
    options={
        "build_exe": build_exe_options,
        "bdist_msi": bdist_msi_options
    },
    executables=[executable]
)
